CBD无法从崩溃转储中获取调用堆栈,但Visual Studio可以

时间:2014-05-13 03:52:49

标签: windbg

我正在尝试编写一个程序来自动从崩溃转储中获取调用堆栈。它运行cdb.exe:

cdb.exe -i "{binaries path}" -y "{binaries path}" -srcpath "{source files path}" -z "{dmp file path}" -lines

然后我将一些命令提供给CDB的标准输入:

.symfix+ c:\\symcache
.ecxr
k
q

对于许多转储,这会成功打印调用堆栈,但是某些转储不起作用。无效的转储输出此错误:

Unable to load image C:\Windows\System32\igdumd32.dll, Win32 error 0n2
*** ERROR: Module load completed but symbols could not be loaded for igdumd32.dll

但是,Visual Studio能够很好地找出调用堆栈。在Visual Studio调用堆栈中,igdumd32.dll位于堆栈的底部:

igdumd32.dll!0c70c570()     
[Frames below may be incorrect and/or missing, no symbols loaded for igdumd32.dll]

我不确定符号是否加载是不是问题,但我无法弄清楚为什么CDB无法在Visual Studio中获取调用堆栈。

1 个答案:

答案 0 :(得分:0)

"Frames below may be incorrect and/or missing"

有时这意味着它的含义,令人讨厌。我不知道VS做了什么绕过它。到目前为止,对cdb最好的是,而不是k,运行kd(cdb命令,而不是kd内核调试器程序!)来获取原始堆栈数据,然后丢弃有用堆栈之间的垃圾线。

您可能希望在kd之后提供多行(十六进制)以获得足够的输出以包含整个调用堆栈。 e.g。

kd 200

哦,这不适用于从64位进程生成的转储,因为kd使用了错误的字大小(假设这是一个错误)。我正在寻找一种干净利落地解决这个问题的方法。对于一个线程,您应该可以使用以下内容:

dps @esp L200

这使用esp寄存器来访问堆栈,这不是可移植的,但对我有用。您可能需要一个不同的注册表。