프로그램 시작부터 끝날 때까지 주어진 응용 프로그램의 변수 집합에 대한 변경 내용을 추적해야합니다. 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()을 실종됐다 ... 그것은 모든 고정