【发布时间】: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- 默认情况下它是无缓冲的。