fflush(stdout) in c

3

当我在使用GDB进行debug时,在fflush(stdout)处断点,是否可以在实际打印之前知道stdout中的内容?

如何在任意时间点了解stdout中的内容?


我认为我没有解释清楚。 基本上,当我的程序结束并刷新stdout时,我会看到奇怪的输出。 这就是为什么我想始终监视stdout以查看何时以及由谁编写了什么内容。 - hari
如果使用 setvbuf(stdout, NULL, _IONBF, 0) 切换到无缓冲输出会发生什么? - Adam Rosenfield
4个回答

2
如果您自己分配缓冲区并将其传递给setvbuf,我想在刷新之前可以访问它,因为它一开始就是您的。
编辑:您的评论使您的意图更加清晰,但您想要的不会很容易:
1.像上面描述的那样设置自己的缓冲区, 2.在stdout上设置一个读取监视点, 3.看着您的程序变得缓慢。
从那时起,每次任何东西访问stdout时,gdb都会中断,并且您可以检查缓冲区是否有更改、奇怪的输出等等。
话虽如此,这绝不是理想的解决方案。一个更好的方法是在您的代码中到处使用启用日志记录的输出函数。

一个注意点是:setvbuf不保证一定会使用你提供的缓冲区。它可能仅在该缓冲区大于现有内部缓冲区时才使用它,或者完全忽略它... - R.. GitHub STOP HELPING ICE

1
你几乎肯定可以这样做,但你可能不应该这样做。标准只要求FILE是一种对于实现有用的类型,用于识别打开的文件和实现操作流的各种函数所需的任何状态。
我通常会同意其他帖子中的观点,即fflush()是了解实际写入文件内容的可靠方法。
然而,如果你已经失去了对代码哪些部分可能会写入流的追踪,那么偶尔观察流的操作并捕捉它的变化可能是有用的。
在实践中,FILE是一个由你的实现在头文件stdio.h中声明的struct的typedef(通常命名为struct _iobuf)。虽然典型的实现只轻微地记录其成员,但典型的实现也将putchar()及其某些友元实现为宏,这些宏也可以在stdio.h中找到。结合你使用gdb的任何工具链的C运行时库的源代码的可能可用性,这就为你提供了查看底层的所有信息。
MinGW GCC 3.4.5提供的stdio.h如下实现FILE
typedef struct _iobuf
{
    char*   _ptr;
    int _cnt;
    char*   _base;
    int _flag;
    int _file;
    int _charbuf;
    int _bufsiz;
    char*   _tmpfname;
} FILE;

// oversimplify declaration of _iob[] here for clarity:
extern FILE _iob[FOPEN_MAX];    /* An array of FILE imported from DLL. */
//...
#define STDIN_FILENO    0
#define STDOUT_FILENO   1
#define STDERR_FILENO   2
#define stdin   (&_iob[STDIN_FILENO])
#define stdout  (&_iob[STDOUT_FILENO])
#define stderr  (&_iob[STDERR_FILENO])

并且利用C语言的GCC扩展,将putchar()实现为内联函数:

__CRT_INLINE int __cdecl __MINGW_NOTHROW putchar(int __c)
{
  return (--stdout->_cnt >= 0)
    ?  (int) (unsigned char) (*stdout->_ptr++ = (char)__c)
    :  _flsbuf (__c, stdout);}

从这里可以看出,缓冲区的末尾由成员_ptr指向,并且可以推断出struct _iobuf中唯一的另一个char *_base)指向缓冲区的开头。成员_cnt显然是剩余未使用字符的计数。函数_flsbuf()必须将无法容纳的第一个字符放在缓冲区的开头,在将当前缓冲区内容写入文件并恢复_cnt字段之后。

因此,如果您观察stdout->_baseBUFSIZ - stdout->_cnt,则对于此实现,您将显示当前缓冲区中有多少内容以及是什么内容。


1

我认为最好刷新stdout,这基本意味着您可以在屏幕上或文件中(如果stdout被重定向)看到内容。


0
使用 "setbuf()",并保留缓冲区的句柄,您可以查看它。不幸的是,我不知道如何找到未刷新数据的偏移量和长度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接