使用GDB在Eclipse中调试C程序时的奇怪行为

时间:2016-03-20 13:39:05

标签: c eclipse debugging gdb

我正在尝试使用Eclipse IDE和GDB调试器来调试需要用户输入的C程序。每次我在控制台中输入用户输入时,我的输入都会显示两次。换句话说,我的输入回显了相同的值。例如,如果我调试以下C程序:

#include <stdio.h>

int main(void) {
    int length, width, height;

    printf("Enter length: ");
    scanf("%d", &length);
    printf("Enter width: ");
    scanf("%d", &width);
    printf("Enter height: ");
    scanf("%d", &height);
    printf("Volume = %d\n", length*width*height);

    return 0;
}

,然后控制台看起来像这样:

Enter length: 2
2
Enter width: 3
3
Enter height: 4
4
Volume = 24

如您所见,值2,3和4分别显示两次。运行此程序(而不是调试)会得到预期的结果:

Enter length: 2
Enter width: 3
Enter height: 4
Volume = 24

此外,我注意到printf()语句的执行被延迟了:虽然我已经点击了#34;跳过&#34;,但控制台中没有显示任何内容。为了使这个问题更加明显,让我们将代码更改为:

#include <stdio.h>

int main(void) {
    int length, width, height;

    printf("Enter length: ");
    printf("Enter length: "); // newly added line
    printf("Enter length: "); // newly added line
    scanf("%d", &length);
    printf("Enter width: ");
    scanf("%d", &width);
    printf("Enter height: ");
    scanf("%d", &height);
    printf("Volume = %d\n", length*width*height);

    return 0;
}

在这种情况下,字符串&#34;输入长度:输入长度:输入长度:&#34;在我跨过第9行:scanf("%d", &length);后,将一次显示。但是,如果我添加一个新行字符&#39; \ n&#39;在每次拨打printf()时,最后都没有问题,字符串将立即打印到控制台。

我知道这两个问题都是微不足道的,但作为强迫症,我真的想知道这里发生了什么。我想这与Eclipse如何处理输入和输出有关?但是在Eclipse中调试java程序时,我再也看不到这些问题了。

PS。我在Mac OS X El Capitan,用于C / C ++开发人员的Eclipse(Mars)IDE上运行,我根据此处给出的说明安装了GDB和Homebrew:http://ntraft.com/installing-gdb-on-os-x-mavericks/

提前感谢您的回答。

1 个答案:

答案 0 :(得分:1)

正在缓冲输出。新行字符刷新缓冲区并在屏幕上显示结果。这就是为什么在添加\n时你没有使用issule的原因。

或者,您可以尝试在printf语句后添加fflush(stdout);

另外,我还建议您使用Xcode代替Eclipse而不是Eclipse。