如何调试使用调试信息编译的共享库

时间:2017-07-19 09:41:55

标签: c debugging gdb lldb allegro5

我正在使用调试simbols编译程序,该程序链接到也使用调试符号编译的共享库(liballegro)。当我尝试进入这个共享库的一个函数时,我看不到任何代码。

file myBin 
mybin: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=d4133ef127e81ffb007c4c17e10f4ddaefac6a0f, with debug_info, not stripped

file lib/liballegro-debug.so
liballegro-debug.so.5.2.2: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=dd75ca87e0ed86832ed02a1c40548a055ad4f551, with debug_info, not stripped

GDB显示了如何使用调试信息加载此lib:

(gdb) info shared
From                To                  Syms Read   Shared Object Library
0x00007ffff7dd9b40  0x00007ffff7df5110  Yes (*)     /lib64/ld-linux-x86-64.so.2
0x00007ffff7a5a0d0  0x00007ffff7b84591  Yes         correct/path/to/liballegro-debug.so
0x00007ffff76ffd60  0x00007ffff7778eef  Yes (*)     /usr/lib/libm.so.6
0x00007ffff74e1640  0x00007ffff74eefb1  Yes (*)     /usr/lib/libpthread.so.0
[...]

所以我在一个函数调用中放了一个断点,它位于共享库中(al_load_bitmap):

90      level->tileset.parent = al_load_bitmap(filename);

al_load_bitmap的源代码位于文件路径/ / src / bitmap_io.c 中,该文件列在gdb info sources

的输出中

进入它:

(gdb) si
0x0000555555555f00 in al_load_bitmap@plt ()

此时我无法确定如何查看此功能的源代码,因为 list 命令不显示任何内容。

如何调试此函数内发生的事情?

PD:我也试过lldb并且结果相同,所以我错过了一些东西。

谢谢。

1 个答案:

答案 0 :(得分:5)

al_load_bitmap@plt是PLT存根(位于主程序中,而不是共享对象),它没有调试信息。您需要跳过几条指令,然后您将到达实际的功能,希望它具有调试信息。如果延迟绑定处于活动状态,您可能还会遇到动态链接器(可以使用LD_BIND_NOW=1环境变量设置禁用它。)

由于这些原因,使用sstep)命令输入函数要容易得多(如果被调用的函数有调试信息)。

在某些情况下,file报告调试信息的存在,但您仍然无法从GDB获得有用的行为(例如行号或本地变量访问)。这是因为有几种类型的调试信息,并且一些发行版/开发人员执行部分剥离或debuginfo分离,只留下最低限度来生成ELF文件中的回溯(这是file报告为未被剥离的内容)。