Какие параметры командной строки Java можно установить для удаленной отладки JVM?

321

Я знаю, что есть некоторые JAVA_OPTSдля удаленной отладки Java-программы.

Что они и что они значат?

paulgreg
источник

Ответы:

303

У меня есть эта статья в закладке на настройку для Java 5 и ниже.

В основном запустить его с :

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

Для Java 5 и выше запустите его с:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044
Ханс Сьюннессон
источник
19
Стоит отметить, что вы можете настроить свой адрес так, *:1044чтобы включить удаленную отладку с любого компьютера
Herr Derb
6
HerrDerb прав. Поскольку Java 9 "address = 1044" не всегда прослушивает все интерфейсы. "address = *: 1044" заставляет Java 9+ вести себя как Java 8 ...
alfonx
459

До Java 5.0 используйте -Xdebug и-Xrunjdwp аргументы. Эти параметры будут работать в более поздних версиях, но будут работать в интерпретируемом режиме вместо JIT, что будет медленнее.

Начиная с Java 5.0, лучше использовать -agentlib:jdwpединственный параметр:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1044

Опции -Xrunjdwpили agentlib:jdwpаргументы:

  • transport=dt_socket : означает способ, используемый для подключения к JVM (сокет является хорошим выбором, его можно использовать для отладки удаленного компьютера)
  • address=8000 : Открыт порт TCP / IP для подключения от отладчика,
  • suspend=y : если 'y', скажите JVM дождаться присоединения отладчика, чтобы начать выполнение, в противном случае (если 'n'), запуск сразу начнется.
paulgreg
источник
7
Вы абсолютно правы .. Я пытался с -Xdebug и -Xrunjdwp, но это не сработало. когда я пытался с -Xrunjdwp или agentlib: jdwp Это работает. (на Java 7)
RoboAlex
Это сработало только для меня, когда я заключил в кавычки, в противном случае я получил эту ошибку: ОШИБКА: JDWP Несерверный транспортный сервер dt_socket = y suspend = y address = 8000 должен иметь адрес подключения, указанный с помощью опции 'address ='
Ring
1
Является Xrunjdwpустаревшим (или удален) , почему бы мы выбрали agentlib:jdwpнад ним?
ArtOfWarfare
2
Я думаю, что ты не прав. Netbeans использует -Xdebug -Xrunjdwpпри отладке проектов Maven, и они работают так, как будто они JITed.
Александр Дубинский
78

Начиная с Java 9.0, JDWP по умолчанию поддерживает только локальные соединения. http://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435

Для удаленной отладки нужно запустить программу с *:адресом:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000
Антоний Шумских
источник
1
Это должно получить больше голосов, так как это важный совет, который применяется ко всем новым версиям Java.
Себастьян С
1
Просто сделаю заметку: ссылка Oracle говорит, что это приведет к тому же самому старому поведению, но это небезопасно и не рекомендуется.
Chanseok Oh
9

Для Java 1.5 или выше:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

Для Java 1.4:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

Для Java 1.3:

java -Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

Вот вывод из простой программы:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044 HelloWhirled
Listening for transport dt_socket at address: 1044
Hello whirled
thebiggestlebowski
источник
5

Ява

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8001,suspend=y -jar target/cxf-boot-simple-0.0.1-SNAPSHOT.jar

address указывает порт, на котором он позволит отлаживать

специалист

** Отладка приложения Spring Boot с Maven:

mvn spring-boot:run -Drun.jvmArguments=**"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8001"
Джови Цяо
источник
2

Вот самое простое решение.

Существует много специальных конфигураций среды, необходимых для использования Maven. Итак, если вы запускаете свою программу из maven, просто запустите mvnDebugкоманду вместоmvn , она позаботится о запуске вашего приложения с настроенной удаленной отладкой. Теперь вы можете просто подключить отладчик к порту 8000.

Он позаботится обо всех проблемах окружающей среды для вас.

Невиш
источник
1

Командная строка

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

Gradle

gradle bootrun --debug-jvm

специалист

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER
Сантош б
источник
1
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER

Здесь мы просто используем Socket Attaching Connector, который включен по умолчанию, когда настроен транспорт dt_socket и виртуальная машина работает в режиме отладки сервера.

Для более подробной информации вы можете обратиться к: https://stackify.com/java-remote-debugging/

Boney
источник