调试时GDB printf奇怪的输出

时间:2011-11-23 07:15:17

标签: c debugging gdb

为什么走出线时不显示printf的输出?但在某些时候它确实打印了第16行。

c file:

#include<stdio.h>

void nextfunc(){
    int ctr;    
    for(ctr = 0; ctr<3; ctr++){
        printf("print ctr = %d",ctr);
    }
    printf("last print");
}
void main(){

    int x;
    printf("input x: ");
    scanf("%d",&x);
    printf("\nprint 2");
    printf("\nprint 3");
    nextfunc();
}

GDB:

    (gdb) break main
    Breakpoint 1 at 0x8048479: file file5.c, line 14.
    (gdb) break nextfunc
    Breakpoint 2 at 0x804843a: file file5.c, line 6.
    (gdb) run
    Starting program: /home/charmae/workspace/AVT/file5 

    Breakpoint 1, main () at file5.c:14
    14      printf("input x: ");
    (gdb) s
    15      scanf("%d",&x);
    (gdb) s
    input x: 4
    16      printf("\nprint 2");
    (gdb) s

    17      printf("\nprint 3");
    (gdb) s
    print 2
    18      nextfunc();
    (gdb) s

    Breakpoint 2, nextfunc () at file5.c:6
    6       for(ctr = 0; ctr<3; ctr++){
    (gdb) s
    7           printf("print ctr = %d",ctr);
    (gdb) s
    6       for(ctr = 0; ctr<3; ctr++){
    (gdb) s
    7           printf("print ctr = %d",ctr);
    (gdb) s
    6       for(ctr = 0; ctr<3; ctr++){
    (gdb) s
    7           printf("print ctr = %d",ctr);
    (gdb) s
    6       for(ctr = 0; ctr<3; ctr++){
    (gdb) s
    9       printf("last print");
    (gdb) s
    10  }
    (gdb) s
    main () at file5.c:19
    19  }
    (gdb) s
    0x0014a113 in __libc_start_main () from /lib/i386-linux-gnu/libc.so.6
    (gdb) s
    Single stepping until exit from function __libc_start_main,
    which has no line number information.
    print 3print ctr = 0print ctr = 1print ctr = 2last print[Inferior 1 (process 2578) exited with code 012]

3 个答案:

答案 0 :(得分:2)

虽然缓存了stdout的输出。这意味着它将保存在临时缓冲区中,直到缓冲区已满,打印换行符或调用函数fflush(stdout)。当程序结束时,stdout也会自动刷新。

您输出的原因是&#34;在错误的地方&#34;在GDB中是因为这种缓冲。您应该在printf格式字符串的末尾添加换行符,或明确调用fflush

答案 1 :(得分:2)

像printf这样的stdio函数是缓冲的,所以它只在遇到换行符时输出。

如果您想立即打印,请在每\n

之后使用换行符fflush(stdout);printf

编辑: Why does printf not flush after the call unless a newline is in the format string?

答案 2 :(得分:1)

诀窍是你没有换行:

printf("last print");

标准IO库将缓冲输出,直到它看到要打印的换行符。输出到终端通常是线路缓冲的;可能gdb运行程序就像它连接到终端一样,因此它会在打印时打印出前面带有\n字符的行。

您输出的输出

... ctr = 2last print[In ...

标准IO库在退出之前刷新所有输入流 - 通过atexit(3)退出处理程序 - 因此输出在程序要求操作系统撕裂之前刷新记下并通知其父母已经死了。