为什么gdb无法找到../sysdeps/unix/sysv/linux/ifaddrs.c

col*_*ang 6 c linux gdb libc

我有libc6libc6-dbg安装。

(gdb) b
reak freeifaddrs
(gdb) run
Breakpoint 1, __freeifaddrs (ifa=0xa822e0) at ../sysdeps/unix/sysv/linux/ifaddrs.c:840
840 ../sysdeps/unix/sysv/linux/ifaddrs.c: No such file or directory.
(gdb) list
835 in ../sysdeps/unix/sysv/linux/ifaddrs.c
(gdb) disassemble
Dump of assembler code for function __freeifaddrs:
=> 0x00007ffff7912fd0 <+0>: jmpq   0x7ffff780f8a8
End of assembler dump.

(gdb) where
#0  __freeifaddrs (ifa=0xa822e0) at ../sysdeps/unix/sysv/linux/ifaddrs.c:840
Run Code Online (Sandbox Code Playgroud)

但是,gdb拒绝获取有关ifaddrs.c的任何信息,尽管它知道它位于第840行

这里发生了什么?

zwo*_*wol 10

libc6-dbg包中的调试信息包括C 库源文件的名称,以及从汇编指令到这些源文件中特定行的映射,但不包括源文件本身。因此gdb可以告诉您断点与名为 的文件的第 840 行相关联sysdeps/unix/sysv/linux/ifaddrs.c,但它无法向您显示该行上的实际内容。(领先../是 glibc 极其复杂的构建系统的产物。)

如果您知道在哪里可以找到GNU C 库源代码的 Git 存储,那么您可以在 Web 浏览器中手动查找该特定文件和行。一旦您知道如何去做,这相对快速和容易,但可能不会向您显示用于构建库副本的完全相同版本的代码(特别是该文件不会经常更改,但其他人这样做),并且它不会让您访问gdb 中的代码。

要使代码在 gdb 中可见,您需要下载与系统上的 C 库匹配的源包。根据包名,libc6-dbg我猜测您使用的是 Debian 系列中的 Linux 发行版;如果是的话,命令

apt-get source glibc
Run Code Online (Sandbox Code Playgroud)

会做的工作。然后你可以使用 GDB 命令directory告诉 GDB 去哪里寻找源文件。让一切正常工作可能需要一些摆弄。

  • @colinfang gdb 在 `dirs` 目录中进行有限的翻查以搜索文件。如果您需要查看 glibc 中的各种函数,“set replacement-path”可能会更好。https://sourceware.org/gdb/onlinedocs/gdb/Source-Path.html (2认同)