我试图调试Eclipse CDT附带的简单Hello World程序。运行该程序通常可以正常工作,但在运行调试模式时,puts()
不会将任何内容打印到控制台。Eclipse中调试问题CDT
我试着用gdb直接运行相同的程序,它工作正常,按预期打印"!!!Hello World!!!"
。
为什么puts()
在调试模式下通过Eclipse运行时不会打印任何内容?
我在Windows上使用MinGW安装,运行GCC 4.5.0,GDB 7.2和CDT 7.0.1
我试图调试Eclipse CDT附带的简单Hello World程序。运行该程序通常可以正常工作,但在运行调试模式时,puts()
不会将任何内容打印到控制台。Eclipse中调试问题CDT
我试着用gdb直接运行相同的程序,它工作正常,按预期打印"!!!Hello World!!!"
。
为什么puts()
在调试模式下通过Eclipse运行时不会打印任何内容?
我在Windows上使用MinGW安装,运行GCC 4.5.0,GDB 7.2和CDT 7.0.1
感谢瑞士指出了正确的方向。
每printf
,puts
一句后添加fflush(stdout)
时调试(当释放,your'd更好地利用fflush()
在适当的时候),不适合大型项目。
然后,我们可以使用预处理指令#ifdef
& & setbuf()
。
在Eclipse中,您的C工程 - >属性 - > C/C++ Build - >设置: Confgiguration =“Debug [Active]” - > Tool Settings - > GCC C Compiler - > Symbols - > Add“_DEBUG”,
然后在你的main(),使用:
#ifdef _DEBUG
setbuf(stdout,NULL); // this disables buffering for stdout.
#endif
你试过追加\ n的卖出期权声明?即puts(“Hello World!\ n”); 某些时候终端需要\ n刷新流。
我明白了为什么会发生这种情况。当通过终端运行GDB时,STDOUT是行缓冲的,这意味着每次读取换行符时它都会被刷新,从而导致我期待的行为。
不过! Eclipse CDT以块缓冲模式运行带有STDOUT的GDB,这意味着它只会在达到一定大小时刷新STDOUT,或者手动刷新时才刷新STDOUT。由于字符串“!!! Hello World !!!”非常短,除非对fflush()
进行调用,否则STDOUT的缓冲区将永远不会被刷新。
我试图通过在致puts()
后添加fflush(stdout);
来解决此问题。
下面是生成的代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
puts("Hello World!"); /* prints !!!Hello World!!! */
fflush(stdout);
return EXIT_SUCCESS;
}
这并没有工作,但它让我意识到,缓冲可能不被冲洗。感谢您指点我正确的方向! – Swiss 2010-10-18 00:13:11