2012-10-22 5 views
1

프로그램 시작부터 끝날 때까지 주어진 응용 프로그램의 변수 집합에 대한 변경 내용을 추적해야합니다. gdb 사용을 생각했습니다.gdb 자동화 - gdb의 stdin 및 stdout 배관

어떻게 고수준으로 계획했는지, gdb를 시작하고 모든 변수에 대한 감시 점을 설정하고 (현재는 모두 전역 변수 임) 실행 명령을 실행하고 변경 사항이 있으면 gdb가 기록합니다 그 위치에서 멈추고 나는 "계속"을 실행할 것입니다. 응용 프로그램이 종료 될 때까지 계속하십시오. 따라서 필요한 모든 변수에 대한 자세한 로그가 있어야합니다.

이 프로세스를 자동화하기 위해 gdb를 하위 프로세스로 열고 하위 프로세스의 stdin 및 stdout 핸들을 사용하여 상호 작용을 시도하는 java 코드를 작성했습니다. processbuilder 클래스를 사용하여 Java에서 하위 프로세스를 만들고 하위 프로세스의 stdin 및 stdout에 작성합니다. 하지만 그것이 작동한다고 생각하는 방식으로 작동하지 않는 것 같습니다. 기본적으로 stdout을 읽는 것으로, gdb가 시작되어 필요한 대상 응용 프로그램을로드하고 있음을 알 수 있습니다. 그러나 어떤 이유로 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를 이런 식으로 자동화하는 방법을 제안 해 줄 수 있습니까?

감사합니다, 오 그것을 생각, 내가 inpStr.flush()을 실종됐다 ... 그것은 모든 고정

답변

관련 문제