我正在尝试调试Eclipse CDT附带的简单Hello World程序。运行程序通常运行正常,但是当它运行调试模式时,puts()
不会向控制台打印任何内容。
我尝试直接使用gdb运行相同的程序并且工作正常,按预期打印"!!!Hello World!!!"
。
为什么puts()
在通过Eclipse以调试模式运行时没有打印任何内容?
我在Windows上安装了MinGW,运行gcc 4.5.0,gdb 7.2和CDT 7.0.1
答案 0 :(得分:4)
感谢瑞士指出了正确的方向
在调试时(发布时,在每个fflush(stdout)
printf
句后添加puts
不适合大型项目更好地在适当的时间使用fflush()
然后,我们可以使用预处理器指令#ifdef
&& setbuf()
。
在Eclipse中,您的C项目 - >属性 - > C / C ++ Build - >设置:
配置=“调试[有效]”
- >工具设置 - > GCC C编译器 - >符号 - >添加“_DEBUG”,
然后在你的main()中,使用:
#ifdef _DEBUG
setbuf(stdout,NULL); // this disables buffering for stdout.
#endif
答案 1 :(得分:1)
您是否尝试在puts语句中附加\ n?即puts(“Hello World!\ n”); 有时终端需要\ n来刷新流。
答案 2 :(得分:1)
我弄清楚为什么会这样。通过终端运行GDB时,STDOUT是行缓冲的,这意味着每次读取换行时都会刷新它,从而产生我期望的行为。
无论其! Eclipse CDT在块缓冲模式下使用STDOUT运行GDB,这意味着它只会在达到特定大小时刷新STDOUT,或者手动刷新它。由于字符串“!!! Hello World !!!”如此短,除非调用fflush()
,否则永远不会刷新STDOUT的缓冲区。
我设法通过在调用fflush(stdout);
后添加puts()
来解决此问题。
以下是生成的代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
puts("Hello World!"); /* prints !!!Hello World!!! */
fflush(stdout);
return EXIT_SUCCESS;
}