blahとretという名前の2つのプログラムがあるとします。 retプログラムからI/Oリダイレクトを介して入力を受け取るプログラムをデバッグしたいblah次の場合、gdbを使用してblahプログラムをデバッグするにはどうすればよいですか?
bash> ret | blah
最初に、プログラムを実行してpidでデバッグすることができます。もちろん、このソリューションはすべてのケースを網羅しているわけではありません。
別のアプローチは、プロセス間通信にLinux機能を使用することです。つまり、ret
の出力をFIFO特殊ファイル( "名前付きパイプ"))にリダイレクトし、そこからFIFOデバッガー。その方法は次のとおりです。bashから次のコマンドを実行します。
mkfifo foo
これにより、ディレクトリに名前付きパイプとして機能する特別なファイルが作成されます。このファイルにテキストを書き込むと(同じ構文echo "Hello" >foo
を使用)、書き込みプログラムは、誰かがファイルからデータを読み取るまで(たとえば、cat <foo
)ブロックします。この場合、gdbで制御されるプロセスがこのファイルから読み取ります。
FIFOを作成したら、bashから実行します。
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の プロセス置換 機能を使用することです。
_$ gdb blah
...
(gdb) run < <(ret)
_
説明:bashは、<(ret)
を_/dev/fd/123
_のようなものに置き換えます。これはret
の標準出力のファイル記述子です。そのfdは、他の回答で説明されている名前付きFIFOと同様に使用できますが、手動で作成する必要がなく、ret
処理する。