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

时间:2013-05-16 22:58:43

标签: gdb

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

  

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

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

答案 1 :(得分:0)

它依赖于 frame pointer ,并从堆栈中获取保存的寄存器值。