为啥没有“通用事件”的调用堆栈

Posted

技术标签:

【中文标题】为啥没有“通用事件”的调用堆栈【英文标题】:Why is there no call stack for "generic events"为什么没有“通用事件”的调用堆栈 【发布时间】:2016-02-02 17:47:34 【问题描述】:

我看过

Capture callstack and events in Xperf

和其他来源,但我想做的最直接的事情就是在 WPA 的“通用事件”图表中显示“堆栈”列。

为什么不存在?当然,因为堆栈信息不可用,但为什么呢?我确实知道“xperf -help stackwalk”,但列出的不是我想要的。例如,

xperf -on networktrace -stackwalk networktrace

不可能获取网络事件的调用栈。为什么?我肯定错过了什么。谢谢!

【问题讨论】:

【参考方案1】:

为用户模式事件激活堆栈具有以下语法:PROVIDER:KEYWORD:LEVEL:'stack'

您必须以这种方式激活堆栈:

"C:\Program Files (x86)\Windows Kits\8.1\Windows 性能 Toolkit\xperf.exe" -start UserLogger -on Microsoft-Windows-Kernel-Network:::'stack'+Microsoft-Windows-Networking-Correlation:::'stack'+Microsoft-Windows-TCPIP:::'stack' -buffersize 2048 -f User.etl

【讨论】:

谢谢,但这不会将堆栈列添加到通用事件图表中。我只得到一个额外的、单独的“堆栈”图。没关系,但不是我期望的,即在通用事件窗口中。我的问题通常与通用事件有关,而不仅仅是用户模式提供者。也许其他内核标志没有相应的用户模式提供程序(是吗?),所以我还不清楚。另外,如果我这样做,符号又会丢失。我们是否必须添加最少的提供程序才能获得符号支持? 通用事件 = 用户模式事件。单击“打开视图编辑器”并在此处激活堆栈列。缺少符号,因为 NETWORKTRACE 还不够。使用捕获 PROC_THREAD+LOADER 的 NETWORK,两者都必须一直使用! 抱歉,这是不对的,因为“networktrace”是内核标志,并且事件显示在“通用事件”图中。无论如何,我只需要接受(但不理解)该图中没有 Stack 列。关于符号,我同时也发现了,谢谢。 如果你激活它们,会有堆栈。我经常用这个。但是对于网络,没有堆栈选项。在这里,您必须激活我告诉您的用户模式提供程序。 顺便说一句,使用 xperf -help stackwalk 查看可以为内核模式事件启用哪些堆栈

以上是关于为啥没有“通用事件”的调用堆栈的主要内容,如果未能解决你的问题,请参考以下文章

为啥 gcc 4.x 在调用方法时默认为 linux 上的堆栈保留 8 个字节?

为啥在我的视图被推送到导航堆栈之前我的 UIAlertView 没有在屏幕上消失?

DLR - 为啥我的堆栈跟踪中没有显示调试信息?

jquery 中所有 Radiobuttonlist 事件的通用事件

制作一个类型精美的通用事件到处理程序分配器函数

Weex内置组件及通用事件