Отладка приложения Java без запуска JVM с аргументами отладки

98

Обычно для присоединения отладчика к работающему jvm вам необходимо запустить jvm с такими аргументами, как:

> java -Xdebug -Xrunjdwp:transport=dt_socket,address=1000,server=y,suspend=n

Теперь, если я хочу отладить процесс, который не был запущен в режиме отладки, что я могу сделать?

Эта ситуация возникает, когда производственная система (т. Е. Запущенная без аргументов отладки) обнаруживает «случайную» (я использую термин вольно) ошибку. Поэтому я не могу перезапустить jvm с соответствующими аргументами, потому что никто не знает, как снова воспроизвести ошибку. Разве в этой ситуации невозможно подключиться к JVM?

Просто чтобы уточнить, нельзя использовать такие инструменты, как jdb, для подключения к уже запущенным JVM, если они не были запущены в режиме отладки.

со страницы руководства JVM

Другой способ использовать jdb - подключить его к уже запущенной виртуальной машине Java. Виртуальная машина, которая должна быть отлажена с помощью jdb, должна быть запущена со следующими параметрами:

хафез
источник

Ответы:

48

Вы можете использовать jsadebugd ( JDK ) для присоединения отладочного сервера к процессу (доступно в Windows с помощью средств отладки для Windows ). Он отмечен как экспериментальный, поэтому сначала вы можете попробовать его на тестовой машине.

Применение:

jsadebugd <pid>
jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=localhost

Имя коннектора с аргументом можно найти с помощью jdb -listconnectors.

Макдауэлл
источник
1
Я использую linux, так что это кажется наиболее многообещающим решением
hhafez
Есть ли опыт, которым можно поделиться с этим?
Thorbjørn Ravn Andersen
1
По моему опыту, он работал хорошо в те моменты, когда мне это было нужно, в то же время все заводские экземпляры программного обеспечения не настроены для запуска с параметрами отладки jvm по умолчанию, поэтому мы можем использовать поддерживаемый метод.
hhafez
На Java 11 jsadebugdбыл заменен на jhsdb debugd. Так что становится jhsdb debugd --pid <pid>. См. Слайды выступления, посвященного jhsdb, и документации по jhsdb
Delthas
Кажется, тоже SADebugServerAttachingConnectorудалили jdb, и я думаю, замена должна быть jhsdb hsdb/ jhsdb clhsdb. Я не могу найти никаких документов о том, какие аргументы приводить jhsdb clhsdb.
Дельтас
32

Чтобы уточнить, нельзя использовать такие инструменты, как jdb, для подключения к уже запущенным JVM>>, если они не были запущены в режиме отладки

в советской россии источник читает вас

jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9426
растение в горшке
источник
1
хорошо, что это "поддерживаемый" ответ, но экспериментальный ответ - это тот, который я принял, так что это может быть сделано в неподдерживаемом
стиле
7

VisualVM не является отладчиком, но вы можете получать из него дампы потоков и кучи, которые могут быть полезны при диагностике некоторых проблем. Для наиболее полезных функций требуется JVM 5 или 6.

sk.
источник
ссылка не работает .... возможно, вы удалите http: // перед https: // ... Я бы хотел, но пока у меня недостаточно репутации
Newtopian
+1 VisualVM выглядит очень интересно. Кстати: ссылка исправлена.
sleske
5

использование jstack (полезно в случае взаимоблокировок) или плагина btrace VisualVM также может помочь

Виджай
источник
-5

Вы всегда можете использовать jdb и отлаживать вручную: P

OscarRyz
источник
2
Я всегда думал, что вы не можете подключиться к jvm с помощью jdb, если jvm не был запущен, чтобы разрешить отладочные соединения. Я ошибаюсь?
hhafez
Насколько я понимаю, вы упомянули вариант «включить» удаленную отладку вашей команды «java» (ВМ). Но вы также можете использовать вместо этого команду jdb. Поэтому вместо java MyApp вы должны использовать jdb MyApp (и выполнять интерактивную отладку, устанавливать точки останова, запускать, останавливать, смотреть и т. Д.)
OscarRyz
1
Я не думаю, что это правильно, согласно странице руководства jdb - начальная цитата Другой способ использования jdb - это присоединение его к виртуальной машине Java, которая уже запущена. Виртуальная машина, которая должна быть отлажена с помощью jdb, должна быть запущена со следующими параметрами: - конец цитаты
hhafez
С правильным соединителем (пока не поддерживается) jdb может подключаться к запущенному процессу.
Торбьёрн Равн Андерсен