捕获Xperf中的callstack和事件

时间:2014-09-11 17:22:33

标签: windows performance profiling xperf

抱歉这个愚蠢的问题。我是Xperf的新手。

我在64位Windows 8.1上,我的应用程序也是x64。我想使用Xperf捕获应用程序中的callstacks和我定义的事件。

我在我的应用程序中注册了GUID 35f7872e-9b6d-4a9b-a674-66f1edd66d5c

当我使用时:

xperf -on PROC_THREAD+LOADER+Base -start UserSession -on 35f7872e-9b6d-4a9b-a674-66f1edd66d5c -BufferSize 1024 -stackwalk profile

我可以获得所有活动,但没有callstack。但是,如果我删除-on 35f7872e-9b6d-4a9b-a674-66f1edd66d5c 并且命令行变为:

xperf -on PROC_THREAD+LOADER+Base -start UserSession -BufferSize 1024 -stackwalk profile

这样,我能够捕获所有的callstack但没有定义的事件。

有谁能告诉我用于捕获callstack和事件的正确命令行是什么?此外,如果你能指出我的任何好的Xperf参考,它会更大。

2 个答案:

答案 0 :(得分:4)

我投了这个问题,即使它形成不好,因为它显示了一个常见的混乱来源。最初的问题是关于“如何记录callstacks”,但这不是一个很好的问题。 xperf可以记录采样分析器,上下文切换,文件I / O,磁盘I / O,注册表活动或自定义事件的调用堆栈。问题没有说明记录了什么类型的调用堆栈,这导致了一些混乱。

让我们看看原始命令行。我通过删除PROC_THREAD + LOADER来简化它,因为BASE包含了这些。我还删除了-BufferSize 1024,因为我认为它放错地方了,我用名称替换了GUID - 你应该给你的提供者一个名字并使用它。所以,我们有:

xperf -on Base -start UserSession -on MyProvider -stackwalk profile

值得注意的是,我们有两个“-on”指令。这意味着我们正在开始两个会话。这相当于:

xperf -on Base
xperf -start UserSession -on MyProvider -stackwalk profile

第一个命令使用“Base”提供程序启动或连接到内核记录程序(无会话名称)。第二个命令使用“MyProvider”提供程序启动名为“UserSession”的用户会话。

现在我们可以看到问题了。 “profile”只是内核记录器上下文中-stackwalk的有效选项。要求用户会话在配置文件事件上记录调用堆栈是没有意义的,因为它不记录配置文件事件!这样就可以让我们看到OP问题的这个变体:

xperf -on Base -stackwalk profile
xperf -start UserSession -on MyProvider
@rem Run tests here
xperf -stop UserSession -stop -d trace.etl

但是等等!如何在MyProvider中调用用户事件的堆栈?这就是第一个答案试图解释的 - 我们需要添加:::'stack':

xperf -on Base -stackwalk profile
xperf -start UserSession -on MyProvider:::'stack'
@rem Run tests here
xperf -stop UserSession -stop -d trace.etl

这些调用堆栈将在WPA的“通用事件”视图中作为堆栈列提供。有关可以记录调用堆栈的许多其他内容的列表,请参阅“xperf -help stackwalk”。请记住,只为您实际录制的事件请求调用堆栈才有意义。幸运的是Base包括Profile,所以我们没事。

哦是的 - 如果你想设置缓冲区大小和缓冲区计数,请务必小心 会话(可能两者)你要设置它。

有关更多信息,尤其是有关如何分析xperf跟踪的信息,请参阅: https://randomascii.wordpress.com/category/xperf/

有关记录ETW跟踪的更简单方法,请参阅此开源UI以控制跟踪记录 - 您可以轻松地将自己的提供程序添加到正在记录的列表中: https://github.com/google/UIforETW/releases

答案 1 :(得分:1)

您需要将:::'stack'添加到命令行以捕获用户模式事件的堆栈。

xperf -start UserSession -on 35f7872e-9b6d-4a9b-a674-66f1edd66d5c:::'stack'

好的xperf参考是书"Inside Windows Debugging"this blog