GDB printf странный вывод при отладке - PullRequest
2 голосов
/ 23 ноября 2011

Почему вывод printf не отображается при выходе из строки? Но в какой-то момент он напечатал строку 16.

c файл:

#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 ]

2 голосов
/ 23 ноября 2011

Вывод, хотя stdout буферизован.Это означает, что он сохраняется во временном буфере до тех пор, пока он не заполнится, не будет напечатана новая строка или не вызвана функция fflush(stdout).stdout автоматически сбрасывается и после завершения программы.

Причина, по которой ваш вывод печатается «в неправильном месте» в GDB, заключается в этой буферизации.Вы должны либо добавить новые строки в конец строки формата printf, либо явно вызвать fflush.

2 голосов
/ 23 ноября 2011

Функции stdio, такие как printf, буферизуются, поэтому выводятся только при обнаружении новой строки.

Если вы хотите немедленную печать, используйте символ новой строки \n или fflush(stdout); после каждого printf

edit: Почему printf не сбрасывается после вызова, если в строке формата нет новой строки?

1 голос
/ 23 ноября 2011

Хитрость в том, что вы не вставили перевод строки:

printf("last print");

Стандартная библиотека ввода-вывода будет буферизовать вывод, пока не увидит новую строку для печати. Вывод на терминалы обычно буферизуется; вероятно, gdb запускает программу так, как будто она подключена к терминалу, поэтому она печатает предыдущие строки с символом \n, когда они печатаются.

На самом деле равно в полученном вами выходе:

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

Стандартная библиотека ввода-вывода сбрасывает все свои входные потоки непосредственно перед выходом - с помощью обработчика выхода atexit(3), так что вывод сбрасывается непосредственно перед тем, как программа просит операционную систему разорвать свою память и сообщите родителю, что он мертв.

...