【问题标题】: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 只是一个程序,您当然可以编写另一个程序来执行所有相同的步骤。编写这样的程序只需要几年时间。