当前位置: 首页 > 面试题库 >

如何使用libc的调试版本

钱承允
2023-03-14
问题内容

简短版的问题: 如何让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中运行时,我看到:

(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的调试版本的信息。


问题答案:

我认为带有调试符号的libc版本在/ usr / lib / debug /
lib中。我尝试将LD_LIBRARY_PATH变量设置为在路径的开头,但这似乎没有什么不同。

这些 不是 您要查找的机器人。

/ usr / lib / debug中的库不是 真正的 库。而是
包含调试信息,但不包含real的.text任何.data部分libc.so.6。您可以在此处阅读有关单独的debuginfo文件的信息。

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

您可以通过设置观察GDB尝试读取的文件set verbose on。下面是你应该看到的时候什么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没有进行搜索/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".


 类似资料:
  • 在最近的vscode版本中,python扩展现在使用debugpy作为默认的Python调试器,取代了旧的ptvsd。 我需要在一个软件程序中调试一个python脚本,该程序适用于python 3.2,而不适用于较新的版本。不幸的是,debugpy只适用于python 有没有办法在vscode python扩展中使用另一个调试器,或者选择使用哪个调试器?换句话说,是否可以调试python

  • 如何配置Angular和VSCode,使我的断点工作?

  • 在尝试使用AzureKeyVault保护密钥时,我遇到以下错误: 00:01:41错误]读取钥匙圈时出错。微软蔚蓝色的钥匙库。模型。KeyVaultErrorException:操作在Microsoft返回了无效的状态代码“禁止”。蔚蓝色的钥匙库。KeyVault客户端。WrapkeyWithTtpMessageAsync(String Vault BaseUrl、String keyName、S

  • 考虑到你不能依赖BuildConfig,你如何区分Android开发中的发布版本和调试版本。DEBUG标志? 我使用Android Studio与Gradle和更喜欢产生释放/调试构建使用Gradle任务,我也需要它来产生那些在TeamCity。 例如,我需要使用不同的值进行发布和调试。我要做的是将它们分别存储在和文件夹中,以便根据构建选择合适的文件夹。这是可以的,但是如果我需要在

  • 问题内容: 我正在使用JavaScript测试运行程序“摩卡”。 我的测试失败了,因此我将使用进行调试。 但是运行测试时,没有输出(仅来自Mocha的测试结果)。看来Mocha已捕获并抑制了我的输出! 如何让Mocha显示输出?(对于失败的测试)? 编辑: 抱歉!- 在测试期间可以正常工作!我肯定一直期望它抑制输出,而且我没有正确检查自己的代码。感谢您的回应。所以…话虽如此…也许抑制通过测试的输出

  • 普通python套接字模块在创建套接字时除了AF_INET不支持协议: 从海星套接字模块.c: 尽管在Linux下支持AF_PACKET、AF_NETLINK和AF_TIPC,但仅支持AF_INET、AF_INET6和AF_UNIX地址族 因此,我已经开始使用ctypes手动调用普通BSD套接字库的套接字、绑定、侦听和直接接受来自libc的调用。我可以创建套接字,将套接字绑定到地址,并将套接符置于