0

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

gdb BT

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

4

1 回答 1

1

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

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

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

给定一个Coredump文件和可执行文件本身,有没有一种我可以自己做的手动方式?

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

于 2015-12-08T17:00:46.393 回答