Winapi 在崩溃转储中查看寄存器

Winapi 在崩溃转储中查看寄存器,winapi,visual-studio-2005,crash-dumps,minidump,Winapi,Visual Studio 2005,Crash Dumps,Minidump,是否有办法查看崩溃转储中每个堆栈帧中的寄存器内容? 发生异常时,“寄存器”窗口似乎包含寄存器,但如果能够在每个堆栈帧中看到它们的内容,这将非常有用。在做了一些研究并对此进行了一些思考后,我意识到这可能是不可能的。崩溃小型转储保存进程内存的某些区域(取决于传递给MiniDumpWriteDump()函数的标志)和足够的状态信息,以便在调试器中重新创建发生崩溃的环境。它在每个指令甚至每个堆栈帧上都没有处理器状态,它只知道异常发生时的处理器状态。我认为在调试时也无法获得它。您可以从寄存器中获得的唯一值

是否有办法查看崩溃转储中每个堆栈帧中的寄存器内容?
发生异常时,“寄存器”窗口似乎包含寄存器,但如果能够在每个堆栈帧中看到它们的内容,这将非常有用。

在做了一些研究并对此进行了一些思考后,我意识到这可能是不可能的。崩溃小型转储保存进程内存的某些区域(取决于传递给MiniDumpWriteDump()函数的标志)和足够的状态信息,以便在调试器中重新创建发生崩溃的环境。它在每个指令甚至每个堆栈帧上都没有处理器状态,它只知道异常发生时的处理器状态。

我认为在调试时也无法获得它。您可以从寄存器中获得的唯一值是它们在当前指令中的值。

根据调用约定,您可以获得一些保存在堆栈上的寄存器。例如,在中,除了EAX、ECX和EDX之外的所有寄存器都需要由调用者或被调用者保存。这三个寄存器是可关闭的,因此您通常无法从调用堆栈的更高层获取它们的值。如果一个函数没有使用必须保存的寄存器,那么它就不会保存它,但由于它没有使用它,该寄存器在下一个更高的堆栈帧中具有相同的值。

在优化的构建中,确实有些信息可能会被抛出堆栈,您可以要求调试器尝试显示给定堆栈帧的信息。首先执行“
kn
”以查看包含帧编号的堆栈,然后尝试“
帧/c[frame]
”或“
帧/r[frame]

有关更多信息,请查看帮助(“
.hh
”)