我知道有一个 /Process:NameOrPID 开关,但它只影响 /StopXXX 命令。从所有进程中收集 ETW 事件会导致生成大的 *.ETL 文件。我试图能够仅从一个进程中捕获 ETW 事件,以避免用不相关的 ETW 事件污染输出文件。
2 回答
更新于 2019 年 4 月 14 日。
现在有一种方法可以做到这一点。请使用/focusProcess=ProcessIDOrName
PerfView 2.0.32 中可用的选项(从 2.0.39 开始在 UI 中也可用)。
如果您知道从您的进程发出事件的 ETW 提供程序的名称,则可以在附加提供程序文本框中或在 perfview 的 -Providers 或 -OnlyProviders 命令行参数中指定提供程序时过滤进程。
来自 PerfView 的文档:
Additional Providers TextBox - 提供者规范的逗号分隔列表。这可以通过使用(...按钮)或以下文本规范来指定。每个提供者规范都有提供者:关键字:级别:值的一般形式。关键字和级别规范部分是可选的,可以省略(例如 provider:keywords:values 或 provider:values 是合法的)。
过程过滤器出现在值部分。文档中的相关部分:
values - 这是一个以分号分隔的值 KEY=VALUE 的列表,用于将额外信息传递给提供者或 ETW 系统。以 @ 开头的 KEY 值是对 ETW 系统的命令。其他所有内容都通过提供者传递(EventSources 直接支持在其 OnEventCommand 方法中接受此信息)。特殊的 ETW 关键字包括
- @ProcessIDFilter - 用于收集数据的十进制进程 ID 的空格分隔列表。只会收集来自这些进程(或在@ProcessNameFilter 中命名的那些)的事件。由于 ID 仅在创建进程后才存在,因此这只适用于收集开始时正在运行的进程。
- @ProcessNameFilter - 以空格分隔的进程名称列表(进程名称是可执行文件的文件名(无路径),包括 .EXE 扩展名)。只会收集来自名称进程(或在@ProcessIDFilter 中命名的那些)的事件。进程是否在收集之前运行并不重要。
因此,如果我有一个名为my-provider的 ETW 提供程序在名为my.process.exe的进程中运行,我可以在针对该进程的命令行上运行 perfview 跟踪,如下所示:
perfview collect -OnlyProviders:"*my-provider:@ProcessNameFilter=my.process.exe"
您仍然会选择一些 perfview 事件,但否则您的事件日志应该是干净的。