プログラムの開始から終了まで、特定のアプリケーション内のいくつかの変数セットへの変更を追跡する必要があります。gdbを使用することを考えました。
高レベルでどのように計画されているか、gdb を起動し、すべての変数にウォッチポイントを設定し (現在はすべてグローバルです)、「実行」コマンドを実行します。変更があると、gdb はそれをログに記録し、そこで停止します。場所と私は「続行」を実行します。アプリケーションが終了するまでこれを続けてください。したがって、必要なすべての変数の詳細なログが必要です。
このプロセスを自動化するために、gdb をサブプロセスとして開き、サブプロセスの stdin と stdout へのハンドルを使用して対話しようとする Java コードを作成しました。processbuilder クラスを使用して Java でサブプロセスを作成し、作成したサブプロセスの stdin と stdout に書き込みます。しかし、思ったようにうまくいかないようです。基本的に stdout を読むと、gdb が必要なターゲット アプリケーションを起動してロードしていることがわかりますが、何らかの理由で stdin に書き込んで GDB とやり取りすることができません。
gdbを自動化するために書いたテストコードは次のとおりです
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
public class GDBTest {
private InputStream outStr = null;
private OutputStream inpStr = null;
private boolean state = false;
public static void main(String[] args) {
GDBTest gdb = new GDBTest();
gdb.test(null);
}
public void test(String[] args) {
ArrayList<String> cmd = new ArrayList<String>();
cmd.add("gdb");
cmd.add("testApp");
ProcessBuilder pb = new ProcessBuilder(cmd);
try {
Process p = pb.start();
inpStr = p.getOutputStream(); /* Handle to the stdin of process */
outStr = p.getInputStream(); /* Handle to the stdout of process */
BufferedReader br = new BufferedReader(new InputStreamReader(outStr));
while(true) {
System.out.println(br.readLine());
state = br.ready();
if(state == false) {
break;
}
}
inpStr.write("watch c88\n".getBytes());
while(br.ready()) {
System.out.println(br.readLine());
}
inpStr.write("run\n".getBytes());
while(br.ready()) {
System.out.println(br.readLine());
}
} catch (Exception e) {
System.out.println(e);
}
}
}
これの何が悪いのかわからない!誰かがこの方法で GDB を自動化する方法を提案できますか?
ありがとう、
マイクロカーネル