gdb如何从堆栈中的所有帧中找到所有寄存器的值

Tec*_*ndz 3 gdb

通过添加断点进行调试时,可以通过运行bt看到堆栈帧.

在通过运行信息寄存器选择帧时,可以看到特定帧上的寄存器值.

例如,考虑在第5帧设置断点.当达到断点时,进入第3帧,可以看到视图寄存器值.

当第5帧设置断点时,gdb如何从第3帧获得寄存器值?

sco*_*ttt 6

它依赖于编译器生成的调试信息来恢复(一些)前一帧的寄存器值,作为堆栈展开过程的一部分.

http://gnu.wildebeest.org/blog/mjw/2007/08/23/stack-unwinding/

为了帮助调试器仍然获得解开堆栈并恢复所有需要的寄存器所需的所有信息,编译器生成的调试信息(DWARF)被扩展为包括调用帧信息(CFI),允许调试器重建调用pc和寄存器功能(参见DWARF 3规范 - 第6.4节).

有关相对容易遵循的DWARF堆栈展开实现,请参阅libgcc中的_Unwind_Backtrace().这是在进程中而不是像GDB那样的进程外.