Как заставить PerfView собирать события ETW, поступающие только от одного процесса
Я знаю, что есть ключ /Process:NameOrPID, но он влияет только на команды /StopXXX. Сбор событий ETW от всех процессов приводит к большому файлу *.ETL. Я пытаюсь быть в состоянии отловить события ETW только от одного процесса, чтобы избежать загрязнения выходного файла несоответствующими событиями ETW.
1 ответ
Там нет никакого способа сделать это сейчас. Пожалуйста, прочитайте этот комментарий Вэнса Моррисона (Vance Morrison) (автора PerfView), где он говорит, что это не является естественным для ETW, так как это вещь для всей машины.
Но если у вас есть конкретные предложения, то вы можете открыть вопрос на PerfView GitHub.
Если вам известны имена провайдеров ETW, отправляющих события из вашего процесса, вы можете отфильтровать процесс при указании провайдеров в текстовом поле Дополнительные провайдеры или в аргументах командной строки -Providers или -OnlyProviders для perfview.
Из документов PerfView:
Дополнительные провайдеры TextBox - разделенный запятыми список спецификаций для провайдеров. Это можно указать с помощью кнопки (...) или следующей текстовой спецификации. Каждая спецификация провайдера имеет общую форму провайдера: ключевые слова: уровень: значения. Части спецификации ключевых слов и уровней являются необязательными и могут быть опущены (например, поставщик: ключевые слова: значения или поставщик: значения допустимы).
Фильтры процессов встречаются в разделе значений. Соответствующие части из документов:
значения - это список значений, разделенных точкой с запятой KEY=VALUE, которые используются для передачи дополнительной информации поставщику или системе ETW. КЛЮЧЕВЫЕ значения, начинающиеся с @, являются командами для системы ETW. Все остальное передается провайдеру (источники событий имеют прямую поддержку для принятия этой информации в своем методе OnEventCommand). Специальные ключевые слова ETW включают
- @ProcessIDFilter - разделенный пробелами список десятичных идентификаторов процессов для сбора данных. Будут собраны только события из этих процессов (или те, которые названы в @ProcessNameFilter). Поскольку идентификаторы существуют только после того, как процесс создан, он работает только с процессами, запущенными во время запуска сбора.
- @ProcessNameFilter - разделенный пробелами список имен процессов (имя процесса - это имя файла (без пути) исполняемого файла, ВКЛЮЧАЯ расширение.EXE). Будут собраны только события из процессов имен (или тех, которые названы в @ProcessIDFilter). Не имеет значения, был ли процесс запущен до сбора или нет.
Итак, если у меня есть поставщик ETW с именем my-provider, работающий в процессе с именем my.process.exe, я мог бы запустить трассировку perfview в командной строке, ориентируясь на процесс следующим образом:
perfview collect -OnlyProviders:"*my-provider:@ProcessNameFilter=my.process.exe"
Вы все равно получите несколько событий perfview, но в противном случае ваш журнал событий должен быть чистым.