Как сказать GDB сбросить stdio отлаживаемой программы

Stdio обычно буферизируется. Когда я достигаю точки останова и перед точкой останова есть printf, напечатанная строка все еще может быть в буфере, и я не могу ее увидеть.

Я знаю, что могу очистить stdio, добавив в программу код сброса. Без этого есть ли способ сказать GDB сбросить stdio отлаживаемой программы после остановки GDB? Этот способ более удобен при отладке программы.

3 ответа

Многие недавние реализации UNIX stdio сбросят все буферы, если вы вызовете fflush(NULL):

(gdb) call fflush(0)

Но обычно вам не нужно этого делать: если вы позвонили printf (и не fprintf), что идет stdout, который идет к вашему терминалу, который обычно был бы с линейной буферизацией. Так что, пока ваш printf печатать новую строку, буфер был бы очищен после printf вернулся.

GDB позволяет вам вызывать функции C непосредственно из командной строки. Так что вы могли бы сделать

(gdb) call setbuf(stdout, NULL)

Теперь единственная проблема в том, что я не знаю, как "получить" реальную ценность stdout во время выполнения.

РЕДАКТИРОВАТЬ Это может помочь (из документов):

call setbuf(fdopen(1, "w"), 0)

Если вы определяете функцию в вашей программе:

void flush_all(void) {
    fflush(NULL);
}

Вы можете вызвать эту функцию изнутри gdb(1) с:

call flush_all()

Короткая демонстрация:

$ cat cat.c
#include <stdio.h>

int main(int argc, char* argv[]) {
    printf("this is a partial write");
    printf("this is a partial write");
    printf("this is a partial write");
    printf("this is a partial write");
    printf("this is a partial write");

    return 0;
}

void flush_all(void) {
    fflush(NULL);
}

$ gcc -g -o cat cat.c
$ gdb
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) file cat
Reading symbols from /home/sarnold/tmp/cat...done.
(gdb) break printf
Breakpoint 1 at 0x400428
(gdb) run
Starting program: /home/sarnold/tmp/cat 

Breakpoint 1, __printf (format=0x4006bc "this is a partial write") at printf.c:30
30  printf.c: No such file or directory.
    in printf.c
(gdb) cont
Continuing.

Breakpoint 1, __printf (format=0x4006bc "this is a partial write") at printf.c:30
30  in printf.c
(gdb) cont
Continuing.

Breakpoint 1, __printf (format=0x4006bc "this is a partial write") at printf.c:30
30  in printf.c
(gdb) call flush_all()
this is a partial writethis is a partial write(gdb) ^CQuit
(gdb) quit

Вы можете использовать display команда как в (gdb) display, подробности которого можно найти здесь. Как только GDB встречает символ конца строки, такой как "\n", вывод будет отображаться. Вы можете выключить дисплей, используяundisplay.

Другие вопросы по тегам