如何使用libc的调试版

时间:2012-04-03 19:52:25

标签: linux gdb libc ldd

问题的简短版本: 如何让gdb使用libc的调试符号?

更长的版本: 我正在使用gdb调试程序,我想查看有关libc使用的futex的信息。但是,在调试期间的某个时刻,我得到输出,例如:

Catchpoint 2 (call to syscall futex), 0x00007ffff772b73e in ?? () from /lib/libc.so.6
(gdb) bt
#0  0x00007ffff772b73e in ?? () from /lib/libc.so.6
#1  0x00007ffff767fb90 in ?? () from /lib/libc.so.6
#2  0x00007ffff767a4c0 in vfprintf () from /lib/libc.so.6
#3  0x00007ffff768565a in printf () from /lib/libc.so.6
....

当我在断点处的gdb中运行info sharedlibrary时,我看到:

(gdb) info sharedlibrary
From                To                  Syms Read   Shared Object Library
0x00007ffff7dddaf0  0x00007ffff7df6704  Yes (*)     /lib64/ld-linux-x86-64.so.2
0x00007ffff7bc53e0  0x00007ffff7bd1388  Yes (*)     /lib/libpthread.so.0
0x00007ffff79ba190  0x00007ffff79bd7d8  Yes (*)     /lib/librt.so.1
0x00007ffff76538c0  0x00007ffff7766c60  Yes (*)     /lib/libc.so.6
0x00007ffff6c1fd80  0x00007ffff6c303c8  Yes (*)     /lib/libgcc_s.so.1
(*): Shared library is missing debugging information.

当我跑ldd时,我看到了:

linux-vdso.so.1 =>  (0x00007ffff7fde000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007ffff7dbf000)
librt.so.1 => /lib/librt.so.1 (0x00007ffff7bb6000)
libc.so.6 => /lib/libc.so.6 (0x00007ffff7833000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffff7fdf000)

我正在使用Ubuntu 10.04,我认为带有调试符号的libc版本在/usr/lib/debug/lib中。我尝试将LD_LIBRARY_PATH变量设置为在路径的前面,但这似乎没有什么区别。

我不清楚程序如何选择加载哪个共享库,无论是在运行时还是编译时设置(我假设运行时但我现在不确定)。因此,有关如何让gdb使用libc的调试版本的信息表示赞赏。

2 个答案:

答案 0 :(得分:66)

  

我认为带有调试符号的libc版本位于/ usr / lib / debug / lib中。我尝试将我的LD_LIBRARY_PATH变量设置为在路径的前面,但这似乎没有什么区别。

这些不是您正在寻找的机器人。

/ usr / lib / debug中的库不是真正的库。而是包含调试信息,但不包含真实.text的{​​{1}}或.data部分。您可以阅读单独的debuginfo文件here

libc.so.6中的文件来自/usr/lib/debug包,GDB会自动加载 ,只要它们与您安装的libc6-dbg版本匹配即可。如果您的libc6libc6不匹配,您应该收到GDB的警告。

您可以通过设置libc6-dbg来观察GDB尝试阅读的文件。以下是set verbose onlibc6匹配时应该看到的内容:

libc6-dbg

更新

  

例如,我看到了   (gdb) set verbose on (gdb) run thread_db_load_search returning 0 Reading symbols from /lib64/ld-linux-x86-64.so.2...Reading symbols from /usr/lib/debug/lib/ld-2.11.1.so...done. thread_db_load_search returning 0 done. thread_db_load_search returning 0 Loaded symbols for /lib64/ld-linux-x86-64.so.2 Reading symbols from system-supplied DSO at 0x7ffff7ffb000...done. WARNING: no debugging symbols found in system-supplied DSO at 0x7ffff7ffb000. thread_db_load_search returning 0 Reading in symbols for dl-debug.c...done. Reading in symbols for rtld.c...done. Reading symbols from /lib/librt.so.1...Reading symbols from /usr/lib/debug/lib/librt-2.11.1.so...done. thread_db_load_search returning 0 ... etc ...

这意味着您的GDB没有搜索Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done。可能发生的一种方法是,如果您/usr/lib/debug中的debug-file-directory设置错误。

以下是默认设置:

.gdbinit

答案 1 :(得分:16)

确保您已安装libc的调试符号:

sudo apt-get install libc6-dbg

如果您正在使用x64系统调试x86代码:

sudo apt-get install libc6:i386
sudo apt-get install libc6-dbg:i386