如何使用libc的debugging版本

简短的问题:如何让gdb使用libc的debugging符号?

更长的版本:我正在用gdbdebugging一个程序,我想查看一下libc使用的futex的信息。 但是,在debugging过程中的某个时候,我得到的输出如下:

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,我认为带有debugging符号的libc版本位于/usr/lib/debug/lib 。 我试图设置我的LD_LIBRARY_PATHvariables有这个在path的前面,但是这似乎没有什么差别。

我并没有完全清楚程序如何select加载哪个共享库,无论这是在运行时还是编译时(我假设的运行时types,但现在我不确定)。 所以有关如何让gdb使用libc的debugging版本的信息,赞赏。

我认为具有debugging符号的libc版本位于/ usr / lib / debug / lib中。 我试图设置我的LD_LIBRARY_PATHvariables有这个在path的前面,但是这似乎没有什么差别。

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

/ usr / lib / debug中的库不是真正的库。 而是包含debugging信息,但不包含真正的libc.so.6 .text.data部分。 你可以在这里阅读有关独立的debuginfo文件。

/usr/lib/debug的文件来自libc6-dbg软件包,GDB会自动加载它们,只要它们与您安装的libc6版本匹配即可。 如果你的libc6libc6-dbg不匹配,你应该从GDB得到一个警告。

您可以通过设置set verbose on来观察GDB正在尝试读取的文件。 以下是libc6libc6-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 ... 

更新:

比如我看到
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done

这意味着你的GDB没有search/usr/lib/debug 。 一种可能发生的情况是,如果你错误地在你的.gdbinit设置了debug-file-directory

这是默认设置:

 (gdb) show debug-file-directory The directory where separate debug symbols are searched for is "/usr/lib/debug". 

确保你已经安装了libc的debugging符号:

 sudo apt-get install libc6-dbg 

如果您在x64系统上debuggingx86代码:

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