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; 
}