自动化gdb - 为gdb管道stdin和stdout

时间:2012-10-22 07:24:57

标签: java automation gdb

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

谢谢,

微内核

1 个答案:

答案 0 :(得分:0)

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