Как подключить отладчик к программе Java, работающей с Commons Daemon Service Runner?

Я хотел бы выполнить некоторую отладку программы Java, работающей в Windows: отследить, распечатать некоторые переменные, установить точки останова, выполнить пошагово через критическую функцию.

Первое, что я попробовал, было jdb -attach 5312. Это не удалось с ошибкой «shmemBase_attach: система не может найти указанный файл». Я нашел несколько связанных вопросов об этом сообщении об ошибке, но они, похоже, говорят о более сложном сценарии, включающем отладчик и цель на разных хостах.

То, что я делаю, - это локальное подключение процесса, поэтому я думаю, что это должно быть проще. Но что-то усложняет.

Целевой процесс не запускается как java -jar foo.jar или что-то подобное. Это файл EXE для конкретного приложения, обертывающий код Java. Он идентифицирует себя в списке процессов как «Обработчик службы демона Commons» и, глядя на строки внутри него, кажется, что это программа prunsrv из демона Apache Commons.

Process Explorer сообщает мне, что аргументы командной строки отсутствуют, а процесс является дочерним по отношению к services.exe. У меня есть возможность запускать и останавливать его из служб Windows, но я не знаю, как с ним что-то еще делать.

Команда jps не показывает этот процесс, но я знаю, что это Java-программа... слегка завернутая. Есть ли способ отладить его?


person Community    schedule 16.06.2017    source источник


Ответы (1)


Попробуйте установить переменную _JAVA_OPTIONS примерно так:

_JAVA_OPTIONS "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=32887"

Эта переменная должна быть получена JVM во время ее запуска.

Затем вы можете попытаться подключиться к этой JVM, позвонив

jdb -attach 32887

где 32887 — произвольный номер порта, используемый отладчиком (номера должны совпадать).

Обновление:

Вы можете использовать различные способы подключения. Тебе решать. То, что я вам дал, — это всего лишь один пример из множества различных способов настройки вещей. Посмотрите здесь для более подробной информации:

https://docs.oracle.com/javase/8/docs/technotes/guides/jpda/conninv.html

Вы также можете использовать VisualVM. В этом случае вам нужно, чтобы процесс JVM был виден пользователю, работающему с VisualVM.

person Oo.oO    schedule 18.06.2017
comment
Мне нужно изменить способ запуска программы, чтобы сделать ее отлаживаемой? И мне нужно использовать протокол удаленной отладки для отладки локального процесса? Мне это кажется очень странным, поскольку я привык к gdb в unix, где я могу подключиться к любому процессу по PID, не требуя от него какого-либо сотрудничества (если я являюсь владельцем или корнем). Я это попробую... - person ; 19.06.2017
comment
И он принимает удаленные подключения от всех с помощью никакой аутентификации! Это непригодно. - person ; 19.06.2017
comment
Просмотрев несколько вариантов, я нашел эту комбинацию: jdb -connector com.sun.jdi.SocketListen:port=12345, а затем настроить целевую службу с помощью prunmgr и добавить параметр -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:12345,server=n,suspend=y. Я полагаю, что немного менее глупо давать миру неаутентифицированный доступ для подключения к моему отладчику в качестве отлаживаемого, чем наоборот. Все еще поражен тем, что нет простого интерфейса в стиле PTRACE_ATTACH. - person ; 19.06.2017