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

gdb如何从堆栈中的所有帧中查找所有寄存器的值,gdb,Gdb,通过添加断点进行调试时,可以通过运行bt查看堆栈帧 通过运行信息寄存器选择帧时,可以看到特定帧上的寄存器值 例如,考虑断点设置在第五帧上。当到达断点时,转到第三帧,可以看到视图寄存器值 当断点设置在第五帧时,gdb如何从第三帧获取寄存器值?它依赖于,并从堆栈中获取保存的寄存器值。它依赖编译器生成的调试信息来恢复上一帧的(一些)寄存器值,作为堆栈展开过程的一部分 以帮助调试器仍能获得解开一个文件所需的所有信息 堆栈并还原调试信息所需的所有寄存器 编译器生成的(DWARF)被扩展以包括调用帧 允许

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

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

例如,考虑断点设置在第五帧上。当到达断点时,转到第三帧,可以看到视图寄存器值


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

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

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

以帮助调试器仍能获得解开一个文件所需的所有信息 堆栈并还原调试信息所需的所有寄存器 编译器生成的(DWARF)被扩展以包括调用帧 允许调试器重建调用pc的信息(CFI) 和函数的寄存器(参见DWARF 3规范第6.4节)


有关一个相对简单的DWARF堆栈展开实现,请参见libgcc中的。这是正在进行中的,而不是像GDB那样的正在进行中的。

你好,尼古拉,感谢您的关注。GDB从何处获取所有寄存器值?帧指针用于堆栈帧,但gdb显示所有寄存器值。查看Scott在回答中提到的堆栈展开信息。基本上,帧指针寻址给定的堆栈帧,其中当前函数保留可能被下一次调用(包括帧指针本身)破坏的寄存器的值。Drawer调试信息描述了它们的位置。感谢Scott的回复。