通过添加断点进行调试时,可以通过运行bt看到堆栈帧。
通过运行信息寄存器选择帧时,可以看到特定帧上的寄存器值。
例如,考虑在第5帧设置断点。当达到断点时,进入第3帧,可以看到视图寄存器值。
当第5帧设置断点时,gdb如何从第3帧获得寄存器值?
答案 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 ,并从堆栈中获取保存的寄存器值。