GDB を使用するテストの作成 - 出力を取得する方法は?
質問
GDB と対話するテストを作成しようとしていますが、出力をキャプチャするのに問題があります。テストを手動で実行した場合に端末に表示されるものと同じようなログ ファイルを生成したいと考えています。ただし、GDB はその出力のキャプチャに関しては非常に頑固であることが判明しています。
GDB と対話でき、出力をログ ファイルにリダイレクトできる Expect スクリプトを作成できましたが、TCL でテストを作成したくありません。Javaと互換性のあるGroovyを使用したいと考えています。何らかの理由で、Perl の Expect および ExpectJ では、プログラム出力は常に端末に送られ、ファイルにリダイレクトできません。
ProcessBuilder を使用して Java から GDB プロセスを開始しようとしましたが、ほとんど機能しますが、print ステートメントの出力が stdout に表示されず、キャプチャできません。Expect が機能するのであれば、Java から Expect を起動して GDB と対話させようと考えましたが、この場合、プログラム出力の大部分が失われ、作成されたプロセスの stdout には表示されません。
そこで私の質問は、GDB と対話し、すべての出力をキャプチャできる Groovy (Java でも問題ありません) でテストを作成するにはどうすればよいでしょうか?
疑似コード:
process = "gdb -q".execute()
waitForPrompt()
send("file exec")
waitForPrompt()
send("run")
send("quit")
ログファイル:
(gdb) file exec
Reading symbols from exec...done.
(gdb) run
Starting program: exec
<... output ...>
Program exited normally.
(gdb) quit
解決
可能性としては、GDB 出力が標準エラーでダンプされており、標準出力のみをキャプチャしている可能性があります。これはリダイレクトで修正できるはずです。次のようなものだと思います。
process = "gdb -q 2&>1".execute()
2 番目の推測は、動作している場合と動作していない場合に「show interactive-mode」が何を言っているかを確認する価値があるかもしれないということです。それらが異なる場合は、何かを行う前に「set interactive-mode off」を試してください。
3 番目のオプションは、GDB のログ機能を使用してログ ファイル (「ログ ファイルの設定」および「ログオンの設定」) を書き込み、自分で出力をキャプチャする必要を避けることです。
他のヒント
あなたのテストはGDB自身のテストとは反対に、実際に何かをデバッグするにはgdbを使用して含まれている場合、あなたはおそらくGDB / MIインターフェイスを使用してになります。