Java+Eclipse: как вы отлаживаете Java-программу, которая получает piped/ перенаправленный стандартный ввод?

Я использую Eclipse для разработки Java-программы и решил добавить опцию в мою программу для анализа stdin, если нет аргументов. (иначе он анализирует файл)

У меня проблемы, если я выполню "somecommand | java -jar myjar.jar" и пошел отлаживать... потом понял, что не знаю, как запустить процесс в Eclipse, как это. И если я запускаю его в командной строке, я не могу подключиться к запущенному процессу, так как процесс запускается немедленно.

Любые предложения о том, как отлаживать?

редактировать: видите, дело в том, что я написал свою программу изначально для аргумента имени файла. Затем я подумал, что было бы полезно также взять stdin, поэтому я абстрагировал InputStream от своей программы (как предлагает мистер Кью). Работает нормально, работает с файлом (java -jar myjar.jar myfile), но не работает, когда я бегу type myfile | java -jar myjar.jar, Я подозреваю, что в этих двух сценариях есть что-то другое (различается ли обнаружение?), Но я действительно хотел бы отладить.

// overall program structure follows:

public static void doit(InputStream is)
{
    ...
}

public static void main(String[] args)
{
    if (args.length > 0)
    {
        // this leaves out the try-catch-finally block,
        // but you get the idea. 
        FileInputStream fis = new FileInputStream(args[0]);
        doit(fis);
        fis.close();
    }
    else
    {
        doit(System.in);
    }
}

4 ответа

Решение

Запустите ваше приложение с конвейером в командной строке, но добавьте аргументы JVM для удаленной отладки, например:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=1044

suspend=y скажет JVM фактически не запускать программу, пока не подключен отладчик.

Далее перейдите в настройки запуска отладки Eclipse (Run -> Debug Configurations...) и создайте "Удаленное Java-приложение" для подключения к вашему приложению. Запустите запуск в Eclipse (после установки некоторых точек останова), и вы сможете отладить. Не очень удобно, но если вы не можете воспроизвести свои проблемы без трубы, это вариант.

Если я правильно истолковываю ваш вопрос, я думаю, что вы просто хотите знать, как передавать входные данные через стандартный вход и отлаживать их в eclipse.

Если это простой ввод, вы можете вручную ввести данные System.in через окно консоли eclipse во время работы программы. Просто начните вводить текст в окне консоли и нажмите Enter, чтобы отправить текст в Standard in.

Если это что-то более сложное, я бы предложил абстрагировать чтение, которое вы пытаетесь сделать, чтобы получить InputStream. В вашей программе вы можете отправить System.in как InputStream. Для отладки вы можете отправить любой другой InputStream. Например, вы можете поместить свой ввод в файл и передать FileInputStream методу для его проверки.

РЕДАКТИРОВАТЬ: Не видя больше кода, я не уверен, но вы могли бы кое-что с обнаружением eof. FileInputStream имеет определенный конец файла, но я предполагаю, что System.in не имеет ничего подобного. Ваш читатель может просто ждать чтения следующего символа и никогда не продвигаться вперед. Возможно, вам придется вручную остановить чтение после того, как вы знаете, что прочитали "достаточно".

Я опоздал на вечеринку. Но вы можете найти "общую" вкладку в конфигурации отладки для вашего проекта. Там вы должны увидеть раздел "Стандартный ввод и вывод". Вы можете выделить консоль входными файлами и настроить выходные файлы таким образом.

Возможно, это решение создания именованного канала может быть применимо здесь.

mkfifo foo
somecommand > foo

Далее в конфигурации отладки добавьте < foo в аргументах, так что ваша программа отлажена как:

java -jar myjar.jar

Другие вопросы по тегам