Eclipse CDT中的调试问题

时间:2010-10-17 19:52:05

标签: c eclipse debugging

我正在尝试调试Eclipse CDT附带的简单Hello World程序。运行程序通常运行正常,但是当它运行调试模式时,puts()不会向控制台打印任何内容。

我尝试直接使用gdb运行相同的程序并且工作正常,按预期打印"!!!Hello World!!!"

为什么puts()在通过Eclipse以调试模式运行时没有打印任何内容?

我在Windows上安装了MinGW,运行gcc 4.5.0,gdb 7.2和CDT 7.0.1

3 个答案:

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