web-dev-qa-db-ja.com

gdb-パイプを使用したデバッグ

blahretという名前の2つのプログラムがあるとします。 retプログラムからI/Oリダイレクトを介して入力を受け取るプログラムをデバッグしたいblah次の場合、gdbを使用してblahプログラムをデバッグするにはどうすればよいですか?

bash> ret | blah 
38
suresh

最初に、プログラムを実行して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など、システムの再起動時に自動的に削除されるディレクトリに配置します)。

45
P Shved

GDBのrunコマンドは、bashを使用してリダイレクトを実行します。 _ret | blah_と同等の機能を実現する簡単な方法は、bashの プロセス置換 機能を使用することです。

_$ gdb blah
...
(gdb) run < <(ret)
_

説明:bashは、<(ret)を_/dev/fd/123_のようなものに置き換えます。これはretの標準出力のファイル記述子です。そのfdは、他の回答で説明されている名前付きFIFOと同様に使用できますが、手動で作成する必要がなく、ret 処理する。

16
Cheng Sun