【问题标题】:How do I run GDB and accept GDB commands through Java output console?如何通过 Java 输出控制台运行 GDB 并接受 GDB 命令?
【发布时间】:2020-04-04 21:19:47
【问题描述】:

我正在尝试为 GCC 构建一个 GUI,它具有一些基本功能,如使用 Java 的 C++ 程序的编译、链接、执行、调试等。我正在创建传递给 ProcessBuilder 并通过命令提示符和 GCC 运行它的命令字符串。

command = "cd src & cd Resources & g++ " + compileFile.cpp +" -Wall "+ " -o "+ "tempOut";

这是编译文件的示例代码。

其中一部分是我使用 GDB 的调试功能。现在的问题是 GDB 需要额外的输入来添加断点、删除断点等等。我在如何通过 Java 终端将这些必要的输入传递给 GDB 时遇到了麻烦。如果我在命令提示符下传递命令,它工作正常并且我得到所需的输出。 enter image description here

但是,每当我从 Java 程序触发 GDB 命令时,我都无法从 IDE 的终端传递任何输入。我知道每个 GDB 命令都使用不同的进程,我尝试将 Java 的进程 ID 附加到 GDB,但我只得到一个空白的输出控制台。 GDB 会话似乎已启动,但无法通过 IDE 的输出控制台与该进程进行交互。

int pid = Integer.parseInt(ManagementFactory.getRuntimeMXBean().getName().split("@")[0]);
command = "gdb attach "+ pid;
fireCommand();

编辑

这是与命令提示符交互以获取输入并在 IDE 的输出控制台中显示输出的方法:

public void fireCommand() {
        String line;
        String os = System.getProperty("os.name");
        ProcessBuilder builder;
        if(os.startsWith("Win")) {
            builder = new ProcessBuilder("cmd.exe", "/c", command);
        }
        else{
            builder = new ProcessBuilder("bash", "-c", command);
        }
        try {

            process = builder.start();

            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(process.getInputStream()));

            while ((line = reader.readLine()) != null) {
                if(line.contains("Input the value")) {
                    //any other user input in non debug execution
                    String value = JOptionPane.showInputDialog(line);
                    BufferedWriter writer = new BufferedWriter(
                            new OutputStreamWriter(process.getOutputStream()));
                    writer.write(value, 0, value.length());
                    writer.newLine();
                    writer.close();
                }
                else {
                    output.append(line).append("\n");
                }
            }
            int exitVal = process.waitFor();
            if (exitVal == 0) {
                //display("Success!");
                display(output.toString());
            } else {
                String lineErr;
                BufferedReader readerErr = new BufferedReader(
                        new InputStreamReader(process.getErrorStream()));
                while ((lineErr = readerErr.readLine()) != null) {
                    outputErr.append(lineErr).append("\n");
                }
                //display(exitVal);
                display(outputErr.toString()); //Display the uncatched errors
            }

        } catch (IOException e) {
            display("There was a problem with the I/O");
            e.printStackTrace();
        } catch (InterruptedException e) {
            display("There was a interruption with the execution");
            e.printStackTrace();
        }
        if(!outputErr.toString().isEmpty())
        errorFormatDisplay();                                                   //display Error output function
    }

这方面的任何线索都会非常有帮助。谢谢。

【问题讨论】:

  • 你能展示从 Java 运行 gdb 的代码吗?
  • @Joni 我添加了用于将命令传递到命令提示符并显示结果的代码。当我将gdb -version 传递给上述方法时,它会显示信息。但是,如果我尝试仅使用 gdb 命令启动 gdb 会话,我可以在输出控制台中输入但它不会处理。

标签: java c++ debugging gcc gdb


【解决方案1】:

我知道每个 GDB 命令使用不同的进程

不,gdb 作为一个进程运行。您的意思是说您每次尝试向它传递gdb 命令时都在创建一个新的gdb 进程?

GDB 会话似乎已启动,但无法通过 IDE 的输出控制台与该进程交互。

也许您应该使用The GDB/MI Interface,例如Emacs 调试器模式gud 使用。

【讨论】:

  • 是的,也使用了 MI 界面。 gbd --interpreter=mi 给出相同的结果。
猜你喜欢
  • 2015-04-14
  • 1970-01-01
  • 2020-03-03
  • 2011-11-20
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
相关资源
最近更新 更多