1

我需要从程序开始到结束跟踪给定应用程序中某些变量集的更改。我想到了使用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。

谢谢,

微内核

4

1 回答 1

0

哦,想通了,我错过了 inpStr.flush() ......它修复了一切!

于 2012-10-22T07:57:41.107 回答