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

时间:2018-01-06 14:51:37

标签: perfview

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

2 个答案:

答案 0 :(得分:1)

更新时间为2019-04-14。

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

答案 1 :(得分:0)

如果您知道从流程中发出事件的ETW提供程序的名称,则可以在“其他提供程序”文本框中或在perfview的-Providers或-OnlyProviders命令行参数中指定提供程序时,对进程进行过滤。

从PerfView的文档中:

  

其他提供商文本框-逗号分隔的提供商规范列表。可以使用(...按钮)或以下文本说明来指定。每个提供程序规范都具有provider:keywords:level:values的一般形式。关键字和级别规范部分是可选的,可以省略(例如provider:keywords:values或provider:values是合法的)。

过程过滤器出现在值部分。文档中的相关部分:

  

values-这是用分号分隔的值KEY = VALUE的列表,这些值用于将额外的信息传递给提供程序或ETW系统。以@开头的键值是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事件,但否则事件日志应该是干净的。