gdb使用什么机制来知道“完成”函数调用的位置?

时间:2016-10-09 10:03:13

标签: linux function debugging gdb execution

在gdb中,当在函数内部进行调试时,我们可以使用“finish”命令运行到函数的末尾。

  

我的问题是:gdb如何知道函数的结束位置,尤其是当没有调试符号来匹配源代码“{}”时?

我猜gdb在x86下查找“leave”或“mov%rbp,%rsp,pop%rbp”以判断它是否已到达函数的末尾。

但问题是,

(1)根据源代码和ABI结构,还有一些额外的寄存器需要在函数调用的开始/结束时按/弹出。

(2)在编译阶段需要推送/弹出寄存器的数量,我担心这个“数字”信息不可用抛出二进制可执行文件。

那么,gdb如何确定,函数调用的结束在哪里,以便“finish”命令可以跳转到它?

谢谢!

1 个答案:

答案 0 :(得分:3)

gdb不会尝试分析机器代码。相反,它展开堆栈,找到调用者的PC,并在那里设置临时断点。然后它让劣质运行直到断点被击中。

由于gdb的unwinder的设计方式,它也会自动处理内联函数中的finish(尽管代码中仍然存在一些特殊情况)。