如何调试像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 期望的位置,您可以尝试使用 directory
或 set 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
.
执行替换
我想调试 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 期望的位置,您可以尝试使用 directory
或 set 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
.