Как заставить PerfView собирать события ETW, поступающие только от одного процесса

Я знаю, что есть переключатель /Process:NameOrPID, но он влияет только на команды /StopXXX. Сбор событий ETW со всех процессов приводит к большому файлу *.ETL. Я пытаюсь перехватывать события ETW только из одного процесса, чтобы не загрязнять выходной файл не относящимися к делу событиями ETW.


person angren    schedule 06.01.2018    source источник


Ответы (2)


Обновлено 14 апреля 2019 г.

Теперь есть способ сделать это. Используйте параметр /focusProcess=ProcessIDOrName, доступный в PerfView 2.0.32 (также доступен в пользовательском интерфейсе, начиная с 2.0.39).

person Igor Labutin    schedule 08.01.2018
comment
Но мы можем эмулировать эту вещь: фильтровать поступающие события по ProcessId и сохранять в выходной файл только отфильтрованные записи. - person angren; 10.01.2018
comment
Да, вы наверняка можете сгенерировать файл .etl вручную при сборе. Но это не то, что сейчас предлагает PerfView. Кроме того, многие события, которые могут быть интересны, не будут связаны с каким-либо идентификатором ProcessID. - person Igor Labutin; 11.01.2018
comment
Обновленный ответ, так как теперь он доступен - person Igor Labutin; 14.04.2019

Если вы знаете имена поставщиков 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, но в остальном ваш журнал событий должен быть чистым.

person abarger    schedule 09.04.2019