如何调试像printf这样的标准c库函数?

How to debug standard c library functions like printf?

我想调试 printf 函数,所以当我进入 printf 函数(gdb 调试器)时,它向我显示了这个:

__printf (format=0x80484d0 " my name is Adam") at printf.c:28
28  printf.c: No such file or directory.

这是什么意思?

当我再次开始步骤时,还有很多这样的陈述。

请帮助我理解这一点。

我觉得已经很清楚了。有一个地方是 gdb 期望源代码的地方,所以下载 glibc 的源代码并将它放在那里。我认为错误消息包含完整路径。

如果它是 linux 发行版,实际上它相当简单,因为通常源代码包也会被运送。否则您需要自己查找源代码,请注意它必须与用于编译 c 库组件的源代码完全相同,而不仅仅是相同的版本,因为发行商经常更改源代码。

好吧,为了让调试器向您显示编译到您正在使用的二进制文件中的代码,您需要在某处找到原始代码。

你好像没有那个,所以你的调试器找不到它。

请注意,您通常不想调试标准库函数的源代码,而只是调试它们的调用方式。为此,您的操作系统的常用 "debug symbol" 软件包是最佳选择。

正如其他人的回答,GDB 无法找到源文件。

对于 C 运行时库,Linux 发行版可能会提供您可以安装的 debuginfo RPM,这可能允许 GDB 查看文件。例如:

$ yum search glibc-debuginfo

...

glibc-debuginfo.x86_64 : Debug information for package glibc
glibc-debuginfo-common.x86_64 : Debug information for package glibc

...

glibc 包和 glibc-debuginfo 是一对配对。没有明确的依赖关系,但是 glibc-debuginfo 包将无法工作,除非它与相同版本的 glibc.

匹配

如果您在某个地方解压了源代码,但不是 GDB 期望的位置,您可以尝试使用 directoryset substitute-path 命令让 GDB 知道源代码在哪里是。

directory 命令告诉 GDB 在它试图查找的任何源文件路径之前添加一个前缀。例如,如果源代码树实际上位于 /tmp 下,您可以使用:

(gdb) directory /tmp

set substitute-path 命令用于告诉 GDB 将源文件路径中的匹配前缀替换为不同的路径前缀。例如,如果编译后的源文件在/build/path/source.c,但在调试时源文件实际上在/usr/home/alice/release-1.1/source.c,那么你可以使用:

(gdb) set substitute-path /build/path /usr/home/alice/release-1.1

该命令假定您只指定了完整的路径名,因此它不会对 /build/pathological/source.c.

执行替换