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

问题描述:

我正在编译带有调试符号的程序,该程序链接到也使用调试符号编译的共享库(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的源代码位于文件路径/ to/src/bitmap_io.c其在gdb 的输出中列出信息来源

和步骤到它:

(gdb) si 
0x0000555555555f00 in [email protected]() 

在这一点上我不明白怎么看这个函数的源代码,列表 COMAND显示什么。

如何调试此功能内发生的事情?

PD:我也试过lldb,结果是一样的,所以我错过了一些东西。

谢谢。

[email protected]是PLT存根(位于主程序中,不是共享对象),它没有调试信息。你需要跨越几条指令,然后你会到达实际的功能,希望有调试信息。如果懒惰绑定处于活动状态(可以使用LD_BIND_NOW=1环境变量设置禁用),您也可能会遇到动态链接器。

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

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