【发布时间】:2016-10-09 10:03:12
【问题描述】:
在gdb中,在函数内部调试时,我们可以使用“finish”命令运行到函数的末尾。
我的问题是:gdb 如何知道函数的结束位置,尤其是在没有调试符号匹配源代码“{}”的情况下?
我猜gdb在x86下寻找“leave”或者“mov %rbp, %rsp,pop %rbp”来判断它是否已经到了函数的末尾。
但问题是,
(1) 根据源代码和 ABI 结构,仍有一些额外的寄存器需要在函数调用的开始/结束时推送/弹出。
(2)需要push/pop的寄存器数量是在编译阶段决定的,恐怕这个“数字”信息不可用throw二进制可执行文件。
那么,gdb 是如何判断一个函数调用的结束在哪里,以便“finish”命令可以跳转到它呢?
谢谢!
【问题讨论】:
标签: linux function debugging gdb execution