如何强制PerfView只收集来自一个进程的ETW事件

8

我知道有一个/Process:NameOrPID开关,但它只影响/StopXXX命令。从所有进程收集ETW事件会导致大的*.ETL文件。我正在尝试仅从一个进程中捕获ETW事件,以避免用不相关的ETW事件污染输出文件。

2个回答

6

更新于2019-04-14。

现在有一种方法可以做到这一点。请使用PerfView 2.0.32中提供的/focusProcess=ProcessIDOrName选项(从2.0.39开始在UI中也可用)。


但我们可以模拟这个过程:通过ProcessId过滤即将发生的事件,并仅将筛选后的记录存储到输出文件中。 - angren
当进行收集时,您肯定可以手动生成 .etl 文件。但这不是 PerfView 现在提供的功能。此外,许多可能有趣的事件将没有任何 ProcessID 相关联。 - Igor Labutin
由于现在已经可用,因此更新答案。 - Igor Labutin

2
如果您知道从您的进程发出事件的ETW提供程序的名称,则可以在指定提供程序时在“附加提供程序”文本框中或在perfview的-Providers或-OnlyProviders命令行参数中过滤进程。以下是来自PerfView文档的内容:
附加提供程序文本框 - 提供程序规范的逗号分隔列表。这可以通过使用(...按钮)或以下文本规范来指定。每个提供程序规范具有提供程序:关键字:级别:值的一般形式。关键字和级别规范部分是可选的,可以省略(例如,provider:keywords:values或provider: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事件,但除此以外,您的事件日志应该是干净的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接