3

fflush(stdout) で GDB を中断したときに、実際に印刷する前に stdout に何があるかを知ることはできますか?

任意の時点で stdout に何があるかを知るにはどうすればよいですか?

4

4 に答える 4

2

自分でバッファを割り当ててsetvbufに渡すと、最初は自分のものなので、フラッシュの前にアクセスできると思います。

編集:あなたのコメントはあなたの意図をより明確にしましたが、あなたが望むものは簡単ではありません:

  1. 上記のように独自のバッファを設定し、
  2. に読み取りウォッチポイントを設定しますstdout
  3. プログラムがゆっくりとクロールするのを見てください。

それ以降、何かがアクセスするgdbたびに中断し、変更、奇妙な出力などについてバッファを確認できます.stdout

とはいえ、それは理想的な解決策ではありません。はるかに優れたアプローチは、コード内のあらゆる場所でロギング対応の出力関数を使用することです。

于 2010-10-29T21:30:30.693 に答える
1

ほぼ確実にできますが、おそらくすべきではありません。標準FILEでは、開いているファイルと、ストリームで動作するさまざまな関数のセマンティクスを実装するために必要な状態を識別するために、実装に役立つ型であることのみが必要です。

fflush()あなたが実際にファイルに何を書いたかを知るための信頼できる方法である他のポスターに私は一般的に同意します.

ただし、コードのどの部分がストリームに書き込んでいる可能性があるかを把握できていない場合は、ストリームの動作を観察し、その変化を把握することが役立つ場合があります。

実際には、実装によってヘッダー ファイル stdio.h (多くの場合 という名前) で宣言されるFILEa の typedef です。典型的な実装では、そのメンバーを軽く文書化するだけですが、典​​型的な実装では、 stdio.h にもあるマクロとして およびその仲間の一部も実装します。これは、gdb で使用する可能性が高いツールチェーンの C ランタイム ライブラリのソースが入手可能であることと相まって、内部を覗くために必要なすべての情報を取得します。structstruct _iobufputchar()

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->_baseBUFSIZ - stdout->_cnt、現在のバッファにある量と内容が表示されます。

于 2010-10-29T21:56:12.097 に答える
1

stdoutつまり、基本的に画面またはファイルにコンテンツが表示されます(リダイレクトされた場合)stdout

于 2010-10-29T21:28:19.047 に答える
0

「setbuf()」を使用し、バッファへのハンドルを保持します。これを覗くことができます。残念ながら、フラッシュされていないデータのオフセットと長さを見つける方法がわかりません。

于 2010-10-29T21:29:09.360 に答える