2012-10-22 83 views
1

我有要求從程序的開始到結束,跟蹤給定應用程序中某些變量集的更改。我想過使用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。

感謝,

微內核

回答

0

哦想通了,我錯過了inpStr.flush()...這一切都固定!

相關問題