如何调试printf等标准c库函数?

时间:2017-08-13 15:36:00

标签: c linux debugging gdb libc

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

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

这是什么意思?

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

请帮助我理解这一点。

3 个答案:

答案 0 :(得分:2)

我认为非常清楚。 gdb 需要源代码,因此请下载 glibc 的源代码并将其放在那里。我认为错误消息包含完整路径。

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

答案 1 :(得分:1)

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

您似乎没有,所以您的调试器无法找到它。

请注意,您通常想要调试std库函数的源代码,而只是调用它们的调用方式。为此,通常的"调试符号"您的操作系统包是最佳的。

答案 2 :(得分:1)

正如其他人回答的那样,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上执行替换。