简短版的问题: 如何让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 ....
当我info sharedlibrary在断点处在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我看到:
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变量设置为在路径的开头,但这似乎没有什么不同。
/usr/lib/debug/lib
LD_LIBRARY_PATH
我尚不清楚程序是如何选择要加载的共享库的,无论是在运行时设置还是在编译时设置(我假设是运行时,但现在不确定)。因此,赞赏有关如何使gdb使用libc的调试版本的信息。
我认为带有调试符号的libc版本在/ usr / lib / debug / lib中。我尝试将LD_LIBRARY_PATH变量设置为在路径的开头,但这似乎没有什么不同。
这些 不是 您要查找的机器人。
/ usr / lib / debug中的库不是 真正的 库。而是 仅 包含调试信息,但不包含real的.text任何.data部分libc.so.6。您可以在此处阅读有关单独的debuginfo文件的信息。
.text
.data
libc.so.6
中的文件/usr/lib/debug来自libc6-dbg软件包,只要与您安装的版本匹配,GDB就会 自动 加载它们libc6。如果libc6和libc6-dbg不匹配,则应从GDB得到警告。
/usr/lib/debug
libc6-dbg
libc6
您可以通过设置观察GDB尝试读取的文件set verbose on。下面是你应该看到的时候什么libc6和libc6-dbg做匹配:
set verbose on
(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
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done
这意味着您的GDB没有进行搜索/usr/lib/debug。可能发生的一种方法是,如果你设置debug-file- directory你的.gdbinit错误。
debug-file- directory
.gdbinit
这是默认设置:
(gdb) show debug-file-directory The directory where separate debug symbols are searched for is "/usr/lib/debug".