【发布时间】:2008-12-10 21:12:32
【问题描述】:
有没有办法在崩溃转储中查看每个堆栈帧中的寄存器内容? 寄存器窗口似乎包含异常发生时的寄存器,但能够在每个堆栈帧中查看它们的内容会很有用。
【问题讨论】:
标签: winapi visual-studio-2005 crash-dumps minidump
有没有办法在崩溃转储中查看每个堆栈帧中的寄存器内容? 寄存器窗口似乎包含异常发生时的寄存器,但能够在每个堆栈帧中查看它们的内容会很有用。
【问题讨论】:
标签: winapi visual-studio-2005 crash-dumps minidump
根据调用约定,您可以获得一些保存在堆栈中的寄存器。例如,在cdecl calling convention 中,除了EAX、ECX 和EDX 之外的所有寄存器都需要被调用者或被调用者保存。这三个寄存器是可破坏的,因此您通常无法从调用堆栈的更高位置获取它们的值。如果函数不使用必须保存的寄存器,则不会保存它,但由于它不使用它,因此该寄存器在下一个更高的堆栈帧中具有相同的值。
【讨论】:
在做了一些研究和思考之后,我意识到这可能是不可能的。崩溃小型转储保存进程内存的某些区域(取决于传递给 MiniDumpWriteDump() 函数的标志)和足够的状态信息,以在调试器中重新创建崩溃发生的环境。它没有每条指令甚至每个堆栈帧的处理器状态,它只知道异常发生时的处理器状态。
【讨论】:
在优化的构建中,确实可能会丢弃堆栈中的某些信息,但是,您可以要求调试器尝试向您显示给定堆栈帧的信息。首先执行“kn”以查看带有帧号的堆栈,然后尝试“.frame /c [frame]”或“.frame /r [frame]”。
查看帮助(“.hh”)了解更多信息。
【讨论】:
我认为您在调试时也无法获得它。您可以从寄存器中获得的唯一值是它们在当前指令中的值。
【讨论】: