【问题标题】:printf statement not printing on console during debuggingprintf 语句在调试期间未在控制台上打印
【发布时间】:2021-08-30 11:25:02
【问题描述】:

我有一个在执行期间创建多个线程的二进制文件。我正在尝试调试一个流程,我已为其插入 printf 语句作为代码中的里程碑。但奇怪的是,它们没有在控制台和 GDB 上打印 - 我不确定我做错了什么以及如何纠正:

./mycore.exe

当我启动流程时,我没有看到我的 printf 字符串打印在控制台上 - 但请查看 GDB 跟踪:

gdb  ./mycore.exe
break filename:linenum
run
[New Thread 11533.0x282c]
[New Thread 11533.0x283c]
[New Thread 11533.0x21d4]
[New Thread 11533.0x24f8]
[New Thread 11533.0x580]
[New Thread 11533.0x10e0]

[Switching to Thread 11533.0x283c]

Breakpoint 1, fuction ()
    at file.c:623
warning: Source file is more recent than executable.
623     {
(gdb) s
629         .........
(gdb) n
631         printf("reached here\n");
(gdb) n
640             ....................
(gdb) n
641             ....................
(gdb) quit
A debugging session is active.

        Inferior 1 [process 11592] will be killed.

如您所见,GDB 步骤的执行流程确实导致了我介绍的代码 - 打印语句。

如何解决这个问题 - 在控制台上打印 printf?

====================更新=========================== ======

我重新编译了代码并再次运行,同样的问题 - 仍然没有打印 printf 字符串:

[Switching to Thread 5868.0x2c0c]

    Breakpoint 1, fuction ()
        at file.c:623
    623     {
    (gdb) s
    629         .........
    (gdb) n
    631         printf("reached here\n");
    (gdb) n
    640             ....................
    (gdb) n
    641             ....................
    (gdb) quit

【问题讨论】:

  • “警告:源文件比可执行文件更新”表示您没有运行最新版本的代码,您是否在引入 print 语句后重新编译了可执行文件?
  • 您在 GDB 中看到有关“源文件比可执行文件更新”的警告消息吗?这非常重要,意味着调试时显示的行可能不是真正执行的。您需要使用更新的源重新构建您的程序。
  • 基于 "file.c" 我猜这是 C 代码,而不是 C++。
  • 是的,它是 C 而不是 C++,我重新编译了代码并再次运行,同样的问题 - 仍然没有打印 printf 字符串
  • setbuf(stdout, NULL); 将完全禁用标准输出缓冲,setlinebuf(stdout); 将缓冲模式更改为每行。而且您确实可以写信给stderr - 默认情况下它是无缓冲的。

标签: c++ gdb


【解决方案1】:

两件事。

  1. 因为消息“警告:源文件比可执行文件更新”。你确定你已经重新编译了吗?

  2. 过去我也有同样的行为。程序中存在内存泄漏,使用调试器将泄漏替换到代码中的其他位置,没有输出到控制台,所以我无法使用调试器找到问题。使用调试器检查所有可能导致泄漏的变量,例如指针。

【讨论】:

  • 我重新编译了代码并再次运行,同样的问题 - 仍然没有打印 printf 字符串 - 我确定目前没有内存泄漏
  • 似乎 fflush(stdout) 解决了这个问题 - 有没有办法让它默认而不是在每次 printf 之后设置
【解决方案2】:

你可以按照我们做的文章我们使用 fflush(stdout)。

https://www.quora.com/Why-do-we-use-the-functions-fflush-stdin-and-fflush-stdout-in-c

您可以使用 puts 而不是 printf() 在运行时登录控制台,您不必为此添加额外的语句。 另一种选择。

puts("we are testing fputs if can be used for debugging logs");

【讨论】: