我正在尝试编写一个程序来自动从崩溃转储中获取调用堆栈。它运行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中获取调用堆栈。
答案 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寄存器来访问堆栈,这不是可移植的,但对我有用。您可能需要一个不同的注册表。