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

Windbg CDB无法从崩溃转储获取调用堆栈,但Visual Studio可以,windbg,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 对于许多转储,这会成功打印调用堆栈,但是有些转储不起作用。不起作用的转储输出此错误: Unab

我正试图编写一个程序来自动从崩溃转储中获取调用堆栈。它运行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
然而,VisualStudio能够很好地理解调用堆栈。在Visual Studio调用堆栈中,igdumd32.dll位于堆栈的底部:

igdumd32.dll!0c70c570()     
[Frames below may be incorrect and/or missing, no symbols loaded for igdumd32.dll]
我不确定符号未加载是否是问题所在,但我不明白为什么CDB不能获得调用堆栈,而Visual Studio可以

"Frames below may be incorrect and/or missing"
有时这意味着它所说的,令人烦恼。我不知道VS做了什么来绕开它。到目前为止,我对cdb最好的方法是运行kd cdb命令,而不是kd内核调试器程序,而不是k!要获取原始堆栈数据,请丢弃有用行之间的垃圾行

您可能希望在kd之后提供大量十六进制的行,以获得足够的输出来包含整个调用堆栈。 e、 g

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

dps @esp L200
这使用esp寄存器访问堆栈,该堆栈不可移植,但适合我。您可能需要另一个注册表

dps @esp L200