gpt4 book ai didi

java - 自动化 gdb - gdb 的管道 stdin 和 stdout

转载 作者:行者123 更新时间:2023-12-01 05:03:45 26 4
gpt4 key购买 nike

我需要从程序开始到结束跟踪给定应用程序中某些变量集的更改。我想到了使用gdb。

高层的计划是,启动gdb,为我的所有变量设置观察点(它们现在都是全局的),然后执行“run”命令,一旦有任何变化,gdb就会记录下来并停在那个位置,我会执行“继续”。连续执行此操作,直到应用程序退出。因此我应该有所有必需变量的详细日志。

为了自动化这个过程,我编写了一个java代码,在其中将gdb作为子进程打开,并尝试使用子进程的stdin和stdout句柄与其进行交互。我正在使用 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。

谢谢

微内核

最佳答案

哦,明白了,我错过了 pStr.flush()...它解决了一切!

关于java - 自动化 gdb - gdb 的管道 stdin 和 stdout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13006724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com