当我在fflush( stdout )并在GDB中断点时,在实际打印之前,我能知道stdout中有什么吗?
我如何知道任何时间点的stdout中有什么内容?
发布于 2010-10-30 05:56:12
你几乎肯定可以,但你可能不应该。标准只要求FILE是一种对实现有用的类型,用于标识打开的文件以及实现在流上操作的各种函数的语义所需的任何状态。
我大体上同意其他人的观点,即fflush()是一种可靠的方式,可以知道你实际写到文件中的内容。
但是,如果您忘记了代码的哪些部分可能正在写入流,那么偶尔观察流的运行情况并捕获它的变化可能会很有用。
在实践中,FILE是由您的实现在头文件stdio.h (通常名为struct _iobuf)中声明的struct的类型定义。尽管典型的实现只对其成员进行简单的记录,但典型的实现也将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])并将putchar()实现为内联函数,利用了对C:
__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显然是缓冲区中剩余的未使用字符的计数。在将当前缓冲区内容写入文件并恢复_cnt字段后,函数_flsbuf()必须获取不适合的第一个字符,并将其放在缓冲区的开头。
因此,如果您观看stdout->_base和BUFSIZ - stdout->_cnt,对于这个实现,您会看到当前缓冲区中有多少和什么。
发布于 2010-10-30 05:30:31
如果您自己分配一个缓冲区并将其传递给setvbuf,我想您可以在刷新之前访问它,因为它一开始就是您的。
编辑:你的评论让你的意图更清晰,但你想要什么并不容易:
stdout,从那时起,每当有任何东西访问stdout时,gdb都会中断,您可以检查缓冲区中的更改、奇怪的输出等。
也就是说,这根本不是一个理想的解决方案。一种更好的方法是在代码中的任何地方使用启用日志的输出函数。
发布于 2010-10-30 05:28:19
我认为刷新stdout更好,这意味着基本上你看到的是屏幕上或文件中的内容(如果stdout被重定向的话)。
https://stackoverflow.com/questions/4056026
复制相似问题