捕获Xperf中的callstack和事件

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

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

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

当我使用时:

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

我可以得到所有的事件,但没有调用堆栈。 但是,如果我删除-on 35f7872e-9b6d-4a9b-a674-66f1edd66d5c并且命令行变成:

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

这样,我能够捕获所有的调用堆栈,但没有定义的事件。

任何人都可以告诉我什么是正确的命令行来捕获调用堆栈和事件? 此外,如果你能指出我的任何好的Xperf参考,它会更大。

Solutions Collecting From Web of "捕获Xperf中的callstack和事件"

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

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

一个很好的xperf参考书是“Inside Windows Debugging”和这个博客 。

我把这个问题投给了这个问题,尽管这个问题形成得不好,因为这个问题显示出一个共同的困惑。 最初的问题是关于“如何记录调用堆栈”,但这不是一个很好的问题。 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”的用户会话。

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

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

可是等等! 那么在MyProvider中的用户事件的调用堆栈呢? 这就是第一个答案试图解释 – 我们需要添加:::'堆栈':

 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踪迹,请参阅此开源用户界面以控制跟踪记录 – 您可以轻松地将自己的提供程序添加到正在记录的列表中: https : //github.com/google/UIforETW/releases