【问题标题】:What mechanism does gdb use to know where to "finish" a function call?gdb 使用什么机制来知道在哪里“完成”函数调用?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-02
      • 1970-01-01
      • 2021-08-07
      • 2023-01-12
      • 2012-03-13
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      相关资源
      最近更新 更多