windows - xperf 调用堆栈跟踪,特定于 dll

标签 windows stack-trace instrumentation xperf

我在使用 xperf 跟踪获取完整调用堆栈时遇到了一些问题。这是在 Win7 64 位电脑上。在更高层次上,我有一个加载多个 dll 的 exe,它们也完成了大部分工作。所有 pdb 文件都在一个目录中,并且我在可执行代码中获得了有效的符号和调用堆栈,因此我非常确定我的符号路径设置正确。

只要我的 exe 调用其中一个加载的 dll,我就会丢失调用堆栈信息并且堆栈列显示 plugin_name.dll!?,它在展开时会调用自身。权重选项卡显示高百分比 (50-90%) 和高计数,但我无法获得堆栈的任何实际函数调用。例如:

Process, Stack, Module, Function, Weight, % Weight, Count, TimeStamp
,    |     kernel32.dll!BaseThreadInitThunk, , , 59067.075556, 73.29, 59075, 
,    |     |- plugin_name.dll!?, , , 45036.186642, 55.88, 45042, 
,    |     |     plugin_name.dll!?, , , 45036.186642, 55.88, 45042, 

基于这些,

http://blogs.msdn.com/b/pigscanfly/archive/2009/08/06/stack-walking-in-xperf.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ff191014(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/ff191014.aspx

这似乎表明 xperf

  • “...不知道地址处的可执行镜像是什么”
  • “...超出了最大堆栈深度”

我发现可能的原因是打开了 FPO(帧指针优化)(我已经使用/Oy 明确禁用了它们,尽管它们不应该打开),或者最大堆栈深度超出了,我不确定如何确定这是否是我正在点击的内容。

如果无法查看 dll 中花费的时间,我无法获得非常有用的信息,因此我想弄清楚发生了什么。

有人对阅读或尝试的内容有任何建议吗?我缺少对 stackwalk 的任何限制吗?是否有任何特殊的符号设置,特定于 dll 中的调用堆栈?

最佳答案

大多数符号加载问题是由于调试引擎和符号服务器库不匹配导致的。

请安装包含 Windows 性能套件的最新 SDK 并从同一目录运行 wpa/xperf 应该可以解决符号加载问题。我假设符号服务器路径是正确的。使用 procexp.exe 查看 dbghelp.dll 和 symsrv.dll 版本和路径以查看 xperf 或目录中的任何工具指向上述 dll 的最新可用或发布版本。

谢谢, 苏珊B

关于windows - xperf 调用堆栈跟踪,特定于 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8859300/

相关文章:

python - 在 PC 上同时运行 Python 2.7 和 3.5

java - 无法启动 Eclipse - Java 已启动但返回退出代码 = 13

python - 获取导致异常的异常描述和堆栈跟踪,全部作为字符串

javascript - 检测代码以跟踪每个 JavaScript 调用

c - 强制内存分配始终到相同的虚拟地址

c# - Environment.SpecialFolder.MyDocuments 有效但 SpecialFolder.MyComputer 无效?

windows - 是否存在用于禁用第 3 方应用程序中的弹出菜单项的 hack,例如 Visual Studio ?

node.js - 如何获取正在运行的 Node.js 进程的线程转储?

java - Stackwalker 的帧数少于 stacktrace 的元素数

Java新手: How to use Java Agent From the Command Line for Instrumentation