2017-08-13 84 views
0

我想调试printf函数,所以当我踏上printf函数内(gdb调试器),它表明我这个:如何调试像printf这样的标准c库函数?

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

这样做有什么意义呢?

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

请帮我理解这一点。

+0

你为什么要调试printf?你期望隐藏在那里的错误? –

+0

您应该假设系统提供的函数,特别是像'printf()这样的核心函数没有错误,并且问题出在您的代码中,而不是函数本身。如果您使用的是现代编译器,请确保使用尽可能多的警告选项进行编译,并且在有任何警告的情况下甚至不尝试运行代码。 (使用GCC,我需要'gcc -O3 -g -std = c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes ...'来保持清洁,即使是来自SO问题的代码也是如此。有时,来自SO的代码必须是对待不同,但不经常) –

+0

是否没有libs的调试版本? –

回答

2

我觉得这很清楚。有一个地方,gdb预计的源代码,所以下载glibc的源代码,并把它放在那里。我认为错误信息包含完整路径。

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

+0

并不像听起来那么简单:需要*完全*与用于编译库的源代码相同。通常,这意味着你想获得你的操作系统/发行版的调试符号和源代码包:) –

+0

@MarcusMüller如果它是一个Linux发行版,它实际上相当简单,因为通常源代码包也被发送。接下来我会将这个评论的第一部分放在答案中,而我并没有说这很容易,只是错误信息清楚了解问题所在。 –

1

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

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

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

+0

好评。这就像OP怀疑这个错误在标准库中,当他的代码很可能出现时。但是,或许OP想要检查这些功能是如何工作的。 –