gdb 使用什么机制来知道在哪里 "finish" 函数调用?

What mechanism does gdb use to know where to "finish" a function call?

在gdb中,在函数内部调试时,我们可以使用"finish"命令来运行函数结束。

My question is: how does gdb know the ending position of a function, especially when there's no debugging symbol to match source code "{}"?

我猜 gdb 在 x86 下寻找 "leave" 或 "mov %rbp, %rsp,pop %rbp" 来判断它是否已经到达函数的结尾。

但问题是,

(1) 根据源代码和 ABI 结构,在函数调用的 begin/end 处仍有一些额外的寄存器需要 push/pop。

(2)寄存器的个数需要push/pop是在编译阶段决定的,恐怕这个"number"信息不可用抛出二进制可执行文件。

那么,gdb是如何判断一个函数调用的结束位置在哪里,以便"finish"命令可以跳转到呢?

谢谢!

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

由于 gdb 展开程序的设计方式,这也会自动处理来自内联函数的 finish(尽管因此代码中仍有一些特殊情况)。