【问题标题】:How does gdb backtrace knows which library each function is taken from?gdb backtrace 如何知道每个函数取自哪个库?
【发布时间】:2023-04-01 23:43:01
【问题描述】:

我编写了一个简单的程序,它所做的只是调用一个名为 meller1 的函数,该函数调用 meller2,依此类推,直到某个函数调用 free 并崩溃。当使用 coredump 文件在这个程序上运行 gdb 回溯时,我收到:

gdb bt

我的问题是,gdb bt 怎么知道 free 取自 /lib/libc.so.6? 给定一个 Coredump 文件和可执行文件本身,有没有一种我可以自己做的手动方式? 谢谢。

【问题讨论】:

    标签: gdb coredump ldd readelf debug-backtrace


    【解决方案1】:

    我的问题是,gdb bt 怎么知道 free 是取自 /lib/libc.so.6 的?

    它没有。 GDB 所知道的(一开始)就是崩溃发生在地址0xf7e3bf9c。然后 GDB 必须努力将该地址映射成有意义的东西。

    GDB 这样做的方式是通过查看当前 ELF 图像的加载器映射来找到正确的图像——“覆盖”给定地址的图像(这给它/lib/libc.so.6),然后读取该 ELF 中的符号表图像找出覆盖给定地址的函数(最终产生free)。

    在给定一个 Coredump 文件和可执行文件本身的情况下,我是否可以手动执行此操作?

    当然:GDB 只是一个程序,您当然可以编写另一个程序来执行所有相同的步骤。编写这样的程序只需要几年时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-21
      • 2014-07-10
      • 2012-10-06
      • 2011-01-29
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      相关资源
      最近更新 更多