我需要从程序开始到结束跟踪给定应用程序中某些变量集的更改。我想到了使用gdb。
高层是如何计划的,启动 gdb,为我的所有变量设置观察点(它们现在都是全局的),并执行“运行”命令,一旦有任何更改,gdb 将记录并停止位置,我会执行“继续”。连续执行此操作,直到应用程序退出。因此,我应该拥有所有必需变量的详细日志。
为了自动化这个过程,我编写了一个 java 代码,在其中我将 gdb 作为子进程打开,并尝试使用子进程的标准输入和标准输出的句柄与它进行交互。我正在使用 processbuilder 类在 Java 中创建子流程,并写入创建的子流程的标准输入和标准输出。但它似乎并没有像我想象的那样工作。基本上通过阅读标准输出,我可以看到 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。
谢谢,
微内核