1

有没有办法在故障转储中查看每个堆栈帧中的寄存器内容?寄存器窗口似乎包含发生异常时的寄存器,但能够在每个堆栈帧中查看它们的内容会很有用。

4

4 回答 4

2

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

于 2008-12-25T16:39:23.873 回答
1

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

于 2008-12-11T04:58:55.403 回答
0

在优化的构建中,确实可能会丢弃堆栈中的某些信息,但是,您可以要求调试器尝试向您显示给定堆栈帧的信息。首先执行“ kn”以查看带有帧号的堆栈,然后尝试“ .frame /c [frame]”或“ .frame /r [frame]”。

查看帮助 (" .hh") 了解更多信息。

于 2009-09-29T16:08:20.223 回答
-1

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

于 2008-12-25T16:18:49.873 回答