我编写了一个简单的程序,它所做的只是调用一个名为 meller1 的函数,该函数调用 meller2,依此类推,直到某个函数调用空闲并崩溃。当使用 coredump 文件在该程序上运行 gdb 回溯时,我收到:
我的问题是,gdb bt 怎么知道 free 是取自 /lib/libc.so.6 的?给定一个Coredump文件和可执行文件本身,有没有一种我可以自己做的手动方式?谢谢。
我的问题是,gdb bt 怎么知道 free 是取自 /lib/libc.so.6 的?
它没有。GDB 所知道的(一开始)就是崩溃发生在 address 0xf7e3bf9c
。然后 GDB 必须努力将该地址映射成有意义的东西。
GDB 这样做的方式是通过查看当前 ELF 图像的加载器映射来找到正确的图像——“覆盖”给定地址的图像(这给出了它/lib/libc.so.6
),然后读取该 ELF 图像中的符号表以找出函数涵盖给定地址(最终产生free
)。
给定一个Coredump文件和可执行文件本身,有没有一种我可以自己做的手动方式?
当然:GDB 只是一个程序,您当然可以编写另一个程序来执行所有相同的步骤。编写这样的程序只需要几年时间。