如何告诉GDB刷新被调试程序的stdio

Yor*_*war 14 debugging buffer gdb stdio

stdio通常是缓冲的.当我遇到一个断点并且在断点之前有一个printf时,打印的字符串可能仍然在缓冲区中,我看不到它.

我知道我可以通过在程序中添加一些刷新代码来刷新stdio.如果不这样做,有没有办法告诉GDB在GDB停止后刷新被调试程序的stdio?调试程序时,这种方式更友好.

Emp*_*ian 9

如果调用,许多最近的UNIX stdio实现将刷新所有缓冲区fflush(NULL):

(gdb) call fflush(0)
Run Code Online (Sandbox Code Playgroud)

但通常你不应该这样做:如果你打电话printf(而不是fprintf),那stdout就是你的终端,这通常是线路缓冲的.因此,只要您printf打印了一个新行,缓冲区就会在printf返回后刷新.


seh*_*ehe 3

GDB 允许您直接从命令行调用 C 函数。所以你可以做

(gdb) call setbuf(stdout, NULL)
Run Code Online (Sandbox Code Playgroud)

现在,唯一的问题是我不知道如何在运行时“获取”实际stdout

编辑这可能会有所帮助(来自文档):

call setbuf(fdopen(1, "w"), 0)
Run Code Online (Sandbox Code Playgroud)