我要求从程序的开始到结束跟踪给定应用程序中某些变量集的更改。我想过使用gdb。
如何计划高级别,启动gdb,为所有变量设置监视点(它们现在都是全局变量),并执行“run”命令,一旦有任何更改,gdb将记录该信息并且停在那个位置,我会执行“继续”。持续执行此操作直到应用程序退出。因此,我应该有所有必需变量的详细日志。
为了自动完成这个过程,我编写了一个java代码,我将gdb作为子进程打开,并尝试使用handle进行子进程的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 :(得分:0)
哦想通了,我错过了inpStr.flush()......它修复了一切!