2010-10-17 115 views
2

我试图调试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

回答

4

感谢瑞士指出了正确的方向。
printfputs一句后添加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 
1

你试过追加\ n的卖出期权声明?即puts(“Hello World!\ n”); 某些时候终端需要\ n刷新流。

+0

这并没有工作,但它让我意识到,缓冲可能不被冲洗。感谢您指点我正确的方向! – Swiss 2010-10-18 00:13:11

1

我明白了为什么会发生这种情况。当通过终端运行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; 
}