如何使用 libc 的调试版本
- 2024-10-17 08:47:00
- admin 原创
- 69
问题描述:
问题的简短版本:
如何让 gdb 使用调试符号libc
?
详细版本:
我正在用 gdb 调试一个程序,我想查看有关 使用的 futex 的信息libc
。然而,在调试过程中的某个时候,我得到了如下输出:
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 时,我看到:
(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
我将不胜感激。
解决方案 1:
我认为带有调试符号的 libc 版本位于 /usr/lib/debug/lib 中。我尝试设置 LD_LIBRARY_PATH 变量以将其置于路径的前面,但这似乎没有什么区别。
这些不是您要找的机器人。
中的库/usr/lib/debug
不是真正的库。相反,它们仅包含调试信息,但不包含真正的 的.text
任何部分。您可以在此处阅读有关单独的调试信息文件的信息。.data
`libc.so.6`
中的文件/usr/lib/debug
来自软件包,只要它们与你安装的版本匹配, libc6-dbg
GDB 就会自动加载它们。如果你的和不匹配,你应该会收到来自 GDB 的警告。libc6
`libc6`libc6-dbg
你可以通过设置 来观察 GDB 尝试读取的文件。当和匹配set verbose on
时,你应该看到以下内容: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 没有搜索/usr/lib/debug
。发生这种情况的原因之一是你设置debug-file-directory
不.gdbinit
正确。
以下是默认设置:
(gdb) show debug-file-directory
The directory where separate debug symbols are searched for is "/usr/lib/debug".
解决方案 2:
确保已经安装了 libc 的调试符号:
sudo apt-get install libc6-dbg
如果你在 x64 系统上调试 x86 代码:
sudo apt-get install libc6:i386
sudo apt-get install libc6-dbg:i386
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件