の2つのプログラムblahとretがあります。私はblahをデバッグしたいと思います。retからの入力をI/Oリダイレクション経由で受け取るプログラムです。次の場合、gdbを使用してblahプログラムをデバッグするにはどうすればよいですか?gdb - パイプによるデバッグ
bash> ret | blah
の2つのプログラムblahとretがあります。私はblahをデバッグしたいと思います。retからの入力をI/Oリダイレクション経由で受け取るプログラムです。次の場合、gdbを使用してblahプログラムをデバッグするにはどうすればよいですか?gdb - パイプによるデバッグ
bash> ret | blah
まず、プログラムを実行してpidでデバッグすることができます。もちろん、このソリューションはすべてのケースをカバーしているわけではありません。
もう1つのアプローチは、プロセス間通信にLinux機能を使用することです。要するに、ret
の出力をFIFO特殊ファイル( "名前付きパイプ")にリダイレクトし、そのFIFOからデバッガ経由で読み込みます。ここでそれがどのように行われます。 bashのことから、次のコマンドを実行します
mkfifo foo
これは名前付きパイプとして機能するディレクトリに特別なファイルを作成します。このファイルに(同じ構文echo "Hello" >foo
を使用して)テキストを書き込むと、誰かがファイルからデータを読み取るまで書き込みプログラムがブロックされます(cat <foo
など)。私たちの場合、gdb制御プロセスはこのファイルから読み込みます。あなたはbashのから実行するFIFOを作成した後
:
ret > foo & # ampersand because it may block as nobody is reading from foo
gdb blah
次に、GDBプロンプトで、
run <foo
を実行して、所望の効果を得ます。 FIFOのデータを通常のパイプと同じように2回読み取ることはできません。すべてのデータを読み終えたら、blah
プロセスが終了し、fooへのコマンド書き込みを繰り返す必要があります。他のシェルウィンドウから)。
完了したらrm foo
でfifoを削除します(または、システム再起動時に自動的に削除されるディレクトリに配置します(/tmp
など)。
GDBのrun
コマンドは、リダイレクトを実行するためにbash
を使用します。 ret | blah
に相当する簡単な方法は、bashのprocess substitution機能を使用することです。
$ gdb blah
...
(gdb) run < <(ret)
説明:bashがret
の標準出力のファイルディスクリプタである/dev/fd/123
のようなもの、と<(ret)
置き換えます。私たちは手動でそれ自身を作成する必要はなく、ret
プロセスの寿命について心配することを除いて、他の答えに記載されているように、そのfdを名前付きFIFOと同様に使用できます。
これは次のものとは異なりますか。http://stackoverflow.com/questions/4521015/how-to-pass-arguments-and-redirect-stdin-from-a-file-to-program-run-in-gdb –