我試圖調試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