如何使用wpa查看通用事件细节?

4

我记录CLR提供程序的ETW事件:

xperf -start clr -on e13c0d23-ccbc-4e12-931b-d9cc2eee27e4 -f clr.etl
...
xperf -stop clr

接着在wpa.exe中打开clr.etl文件,会看到很多“通用事件”。但是似乎wpa无法显示一些在MSDN中描述的数据。

我所能看到的只有类似于这样的内容:

Process    Unknown
Id    1
Opcode Name
Task Name
Provider Name    e13c0d23-ccbc-4e12-931b-d9cc2eee27e4
Time    0,071731589s
Selection Duration    0,416407863s
Start Time    0,002151869s
End Time    0,418559732s
Data Points    1
Table Data    Point    Selection
Cpu    0    
ThreadId    50 440    
Sum of Count    1    23
Time (s)    0,071846769    

看起来这是一个GCStart_V1事件,但我找不到例如字段Reason

在wpa中是否可以查看通用事件数据?

WPA版本- 10.0.10586.212


使用 WPR 捕获数据:**"C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\wpr.exe" -start DotNET** 和 "C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\wpr.exe" -stop C:\clr.etl,现在在 WPA 中查看数据。 - magicandre1981
它不显示更多信息,除了进程名称。没有显示额外的字段 :( - Sergey Azarkevich
你使用哪个版本的Windows?还要用Perfview打开ETL文件,并查看该工具是否显示数据:https://www.microsoft.com/en-us/download/details.aspx?id=28567 - magicandre1981
我使用Windows 7。之前我尝试过Perfview,它可以显示与GC相关的事件。但例如,它无法解释来自TPL(任务并行库)的事件。WPA可以显示TPL事件,但是缺少额外的信息(这些信息肯定存在于.ETL文件中)。现在对我而言,似乎通用事件不能在WPA中分析,但可以在一些专门的工具中进行分析。例如Perfview用于GC(以及其他一些情况),Concurrency Visualizer用于TPL... - Sergey Azarkevich
perfview使用自己的提供程序解析器,因此请尝试Alois的建议,也许清单没有正确注册。 - magicandre1981
2个回答

5

在“普通”计算机上,由于.NET热修补程序等原因,CLR ETW提供程序注册经常出问题。在这种情况下,您需要使用(64位)重新注册它。

wevtutil um %windir%\Microsoft.NET\Framework64\v4.0.30319\CLR-ETW.man
wevtutil im %windir%\Microsoft.NET\Framework64\v4.0.30319\CLR-ETW.man

如果您的问题是视图没有配置以查看自定义事件的 Field1 .. N,则来自 lowleveldesign 的答案就是正确的。

这个清单问题也是我所认为的。顺便说一下,我在sysinternals论坛上回答了你的LiveKD问题。 - magicandre1981
谢谢Andre!那确实有帮助。正确的SDK版本解决了问题。 - Alois Kraus

5

一点说明:我通常至少使用这两个内核标志记录跟踪:

xperf -on PROC_THREAD+LOADER -start clr -on e13c0d23-ccbc-4e12-931b-d9cc2eee27e4
xperf -stop -stop clr -d clr.etl

否则,进程名称可能无法在WPA中解析。
回到您的问题,自定义字段在WPA中的呈现方式有点奇怪,但是一旦您克服了最初的困难,您会发现它的编辑器非常有用。您提到的字段是给定事件特定的自定义字段之一。默认情况下,这些字段不会显示,您需要在高级视图窗口中添加它们:

add-field-to-view

我将 Field1 拖动到了 Thread Name 列的前面。然后您需要选择一个事件(不是其父级,而是带有事件的行),您会注意到字段的列名相应地更改:

reason-field

此外,Message 字段通常包含所有字段(它们的名称和值),例如在此示例中:Reason=1; Count=2; ClrInstanceID=36

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