在gdb中,当在函数内部进行调试时,我们可以使用“finish”命令运行到函数的末尾。
我的问题是:gdb如何知道函数的结束位置,尤其是当没有调试符号来匹配源代码“{}”时?
我猜gdb在x86下查找“leave”或“mov%rbp,%rsp,pop%rbp”以判断它是否已到达函数的末尾。
但问题是,
(1)根据源代码和ABI结构,还有一些额外的寄存器需要在函数调用的开始/结束时按/弹出。
(2)在编译阶段需要推送/弹出寄存器的数量,我担心这个“数字”信息不可用抛出二进制可执行文件。
那么,gdb如何确定,函数调用的结束在哪里,以便“finish”命令可以跳转到它?
谢谢!
答案 0 :(得分:3)
gdb不会尝试分析机器代码。相反,它展开堆栈,找到调用者的PC,并在那里设置临时断点。然后它让劣质运行直到断点被击中。
由于gdb的unwinder的设计方式,它也会自动处理内联函数中的finish
(尽管代码中仍然存在一些特殊情况)。