Как обрабатывать ввод для консольного приложения Java, отлаженного с помощью Java JDI? - PullRequest
0 голосов
/ 19 июня 2020

Я работаю над написанием собственного отладчика с JDI для проекта uni. С помощью этого отладчика я хочу регистрировать выполненные строки кода и атрибуты целевой программы. Позже я хочу визуализировать файл журнала.

Я довел отладчик до точки, где он регистрирует строки и значения атрибутов, но застревает, когда я отлаживаю консольное приложение Java, и консольное приложение ожидает ввода в cmd, потому что у меня нет возможности ввести ввод.

Теперь немного кода:

Это та часть, где мой отладчик застревает

    public static void options() throws IOException {
        System.out.println("Choose an Option:");
        System.out.println("Type \"count\" to start the counting function.");
        System.out.println("Type \"vowels\" to count the vowels of a String.");
        System.out.println("Type \"consonants\" to count the consonants of a String.");
        System.out.println("Type \"both\" to count vowels and consonants.");
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String entry = reader.readLine();

Когда отладчик достигает reader.readline (), он застревает, потому что отлаженная программа ожидает ввода, но я не могу переслать ему ввод, потому что мой cmd запускает программу отладчика, а отладчик не обрабатывает ввод.

Это основной метод моего отладчика:

        VirtualMachine vm = null;
        try {
            vm = log.connectAndLaunchVM();
            log.enableClassPrepareRequests(vm);
            EventSet eventSet;
            while ((eventSet = vm.eventQueue().remove()) != null){
                for (Event e : eventSet){
                    if(e instanceof ClassPrepareEvent) {
                        log.handleClassPrepareEvents(vm, (ClassPrepareEvent) e);
                    }
                    if(e instanceof StepEvent){
                        log.printLocalVariables((StepEvent) e);
                    }
                    vm.resume();
                }
            }
        }catch (VMDisconnectedException e){
            System.out.println("VM disconnected.");
        } catch (Exception e){
            e.printStackTrace();

Я подумал о двух возможных решениях:

  • Откройте целевой отладчик в его собственном окне cmd.
  • Каким-то образом позволить отладчику пересылать и получать входные и выходные данные отладчика

Я пробовал заставить его работать с vm. process .getInputStream () и .getOutputS tream (), но не смог заставить его работать должным образом, потому что я не знал, где обрабатывать getOutputStream в моем отладчике.

Заранее благодарим за любые ответы и советы о том, как это сделать! Если у вас возникнут вопросы по моему вопросу, я с радостью отвечу на них.

...