2008-12-10 61 views
1

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

回答

2

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

1

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

-1

我不认为你可以在调试时得到它。您可以从寄存器获得的唯一值是当前指令的值。

0

在经过优化的版本中,向下堆叠的某些信息可能会被扔掉,但是,您可以要求调试器尝试向您显示给定堆栈帧的信息。首先执行“kn”以查看具有帧编号的堆栈,然后尝试“.frame /c [frame]”或“.frame /r [frame]”。

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