如何使用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_PATH
variables有这个在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
版本匹配即可。 如果你的libc6
和libc6-dbg
不匹配,你应该从GDB得到一个警告。
您可以通过设置set verbose on
来观察GDB正在尝试读取的文件。 以下是libc6
和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 ...
更新:
比如我看到
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