4

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

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

例如,考虑断点设置在第 5 帧。当断点被击中时,转到第 3 帧,可以看到查看寄存器值。

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

4

2 回答 2

6

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

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

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

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

于 2013-05-17T06:28:10.943 回答
0

它依赖于帧指针,并从堆栈中获取保存的寄存器值。

于 2013-05-16T23:08:59.040 回答