我有要求從程序的開始到結束,跟蹤給定應用程序中某些變量集的更改。我想過使用gdb。gdb自動化 - 針對gdb的管道標準輸入和標準輸出
如何在高層次的計劃是,啓動gdb,設置觀測點,以我的所有變量(它們都是全球現在),並執行「運行」命令,一旦有任何改變,GDB將日誌並停在那個位置,我會執行「繼續」。持續這樣做直到應用程序退出。因此,我應該有詳細的日誌到所有需要的變量。
爲了實現這個過程的自動化,我編寫了一個java代碼,將gdb打開爲子進程,並嘗試使用子進程的stdin和stdout的句柄與它進行交互。 我使用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。
感謝,
微內核