fflush(stdout) で GDB を中断したときに、実際に印刷する前に stdout に何があるかを知ることはできますか?
任意の時点で stdout に何があるかを知るにはどうすればよいですか?
自分でバッファを割り当ててsetvbufに渡すと、最初は自分のものなので、フラッシュの前にアクセスできると思います。
編集:あなたのコメントはあなたの意図をより明確にしましたが、あなたが望むものは簡単ではありません:
stdout
。それ以降、何かがアクセスするgdb
たびに中断し、変更、奇妙な出力などについてバッファを確認できます.stdout
とはいえ、それは理想的な解決策ではありません。はるかに優れたアプローチは、コード内のあらゆる場所でロギング対応の出力関数を使用することです。
ほぼ確実にできますが、おそらくすべきではありません。標準FILE
では、開いているファイルと、ストリームで動作するさまざまな関数のセマンティクスを実装するために必要な状態を識別するために、実装に役立つ型であることのみが必要です。
fflush()
あなたが実際にファイルに何を書いたかを知るための信頼できる方法である他のポスターに私は一般的に同意します.
ただし、コードのどの部分がストリームに書き込んでいる可能性があるかを把握できていない場合は、ストリームの動作を観察し、その変化を把握することが役立つ場合があります。
実際には、実装によってヘッダー ファイル stdio.h (多くの場合 という名前) で宣言されるFILE
a の typedef です。典型的な実装では、そのメンバーを軽く文書化するだけですが、典型的な実装では、 stdio.h にもあるマクロとして およびその仲間の一部も実装します。これは、gdb で使用する可能性が高いツールチェーンの C ランタイム ライブラリのソースが入手可能であることと相まって、内部を覗くために必要なすべての情報を取得します。struct
struct _iobuf
putchar()
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 への GCC 拡張機能を利用して、インライン関数として実装します。
__CRT_INLINE int __cdecl __MINGW_NOTHROW putchar(int __c)
{
return (--stdout->_cnt >= 0)
? (int) (unsigned char) (*stdout->_ptr++ = (char)__c)
: _flsbuf (__c, stdout);}
このことから、バッファーの末尾が member によって指されていることがわかり、( ) 内の他の唯一のものはバッファーの先頭を指している_ptr
と推測できます。メンバーは明らかに、バッファーに残っている未使用の文字の数です。関数は、現在のバッファーの内容をファイルに書き込んでフィールドを復元した後、収まらなかった最初の文字を取得してバッファーの先頭に配置する必要があります。char *
struct _iobuf
_base
_cnt
_flsbuf()
_cnt
したがって、この実装を監視するstdout->_base
とBUFSIZ - stdout->_cnt
、現在のバッファにある量と内容が表示されます。
stdout
つまり、基本的に画面またはファイルにコンテンツが表示されます(リダイレクトされた場合)stdout
。
「setbuf()」を使用し、バッファへのハンドルを保持します。これを覗くことができます。残念ながら、フラッシュされていないデータのオフセットと長さを見つける方法がわかりません。