我有libc6与libc6-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 去哪里寻找源文件。让一切正常工作可能需要一些摆弄。