我在使用 xperf 跟踪获取完整调用堆栈时遇到了一些问题。这是在 Win7 64 位电脑上。在更高的层次上,我有一个加载多个 dll 的 exe,这些 dll 也完成了大部分工作。所有 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 中的调用堆栈?