Как запустить GDB и принимать команды GDB через консоль вывода Java? - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь построить GUI для G CC, который имеет некоторые базовые c функции, такие как компиляция, компоновка, выполнение, отладка и т. Д. c для программ на C ++ с использованием Java. Я создаю строки команд, которые я передаю ProcessBuilder и запускаю из командной строки и G CC.

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

Это пример кода для компиляции файла.

Часть это функциональность отладки, для которой я использую GDB. Теперь проблема в том, что GDB требуется дополнительный ввод для добавления точек останова, удаления точек останова и так далее. У меня возникли проблемы с передачей этих необходимых входов в GDB через терминал Java. Если я передаю команды в командной строке, она работает нормально, и я получаю желаемый результат. введите описание изображения здесь

Но всякий раз, когда я запускаю команду GDB из программы Java, я не могу передавать какие-либо входы с терминала IDE. Я знаю, что каждая команда GDB использует свой процесс, и я пытался присоединить идентификатор процесса Java к GDB, но я просто получил пустую консоль вывода. Кажется, что сеанс GDB начался, но нет возможности взаимодействовать с этим процессом через выходную консоль IDE.

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

EDIT

Это метод который взаимодействует с командной строкой для получения ввода и отображения вывода в консоли вывода 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
    }

Любые выводы по этому вопросу были бы очень полезны. Спасибо.

1 Ответ

0 голосов
/ 05 апреля 2020

Мне известно, что каждая команда GDB использует отдельный процесс

Нет, gdb выполняется как один процесс. Вы хотели сказать, что создаете новый процесс gdb каждый раз, когда пытаетесь передать ему команду gdb?

Кажется, что сеанс GDB начался, но пути нет взаимодействовать с этим процессом через выходную консоль IDE.

Возможно, вам следует использовать Интерфейс GDB / MI , который используется, например, в режиме отладчика Emacs gud.

...