Я знаю, что есть переключатель /Process:NameOrPID, но он влияет только на команды /StopXXX. Сбор событий ETW со всех процессов приводит к большому файлу *.ETL. Я пытаюсь перехватывать события ETW только из одного процесса, чтобы не загрязнять выходной файл не относящимися к делу событиями ETW.
Как заставить PerfView собирать события ETW, поступающие только от одного процесса
Ответы (2)
Обновлено 14 апреля 2019 г.
Теперь есть способ сделать это. Используйте параметр /focusProcess=ProcessIDOrName
, доступный в PerfView 2.0.32 (также доступен в пользовательском интерфейсе, начиная с 2.0.39).
Если вы знаете имена поставщиков ETW, отправляющих события из вашего процесса, вы можете отфильтровать процесс при указании поставщиков в текстовом поле Дополнительные поставщики или в аргументах командной строки -Providers или -OnlyProviders для perfview.
Из документов PerfView:
Текстовое поле «Дополнительные поставщики» — разделенный запятыми список спецификаций для поставщиков. Это можно указать с помощью (кнопки ...) или следующей текстовой спецификации. Каждая спецификация провайдера имеет общую форму провайдер:ключевые слова:уровень:значения. Части спецификации ключевого слова и уровней являются необязательными и могут быть опущены (например, провайдер:ключевые слова:значения или провайдер:значения допустимы).
Фильтры процессов находятся в разделе значений. Соответствующие части из документов:
values — это список разделенных точкой с запятой значений KEY=VALUE, которые используются для передачи дополнительной информации поставщику или системе ETW. Значения KEY, начинающиеся с символа @, являются командами для системы ETW. Все остальное передается провайдеру (EventSources имеют прямую поддержку приема этой информации в своем методе OnEventCommand). Специальные ключевые слова ETW включают
- @ProcessIDFilter — список десятичных идентификаторов процессов, разделенных пробелами, для сбора данных. Будут собираться только события из этих процессов (или тех, которые указаны в @ProcessNameFilter). Поскольку идентификаторы существуют только после создания процесса, это работает только с процессами, запущенными в момент начала сбора данных.
- @ProcessNameFilter — список имен процессов, разделенных пробелами (имя процесса — это имя файла (без пути) исполняемого файла, ВКЛЮЧАЯ расширение .EXE). Будут собираться только события из процессов имен (или тех, которые указаны в @ProcessIDFilter). Неважно, был ли процесс запущен до сбора или нет.
Таким образом, если у меня есть поставщик ETW с именем my-provider, работающий в процессе с именем my.process.exe, я могу запустить трассировку perfview в командной строке, нацеленную на этот процесс. вот так:
perfview collect -OnlyProviders:"*my-provider:@ProcessNameFilter=my.process.exe"
Вы все равно получите несколько событий perfview, но в остальном ваш журнал событий должен быть чистым.