Удаленная отладка приложения Java

254

У меня есть Java-приложение, работающее на машине Linux. Я запускаю Java-приложение, используя следующее:

java myapp -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000, suspend=n

Я открыл порт 4000 для TCP на этой машине Linux. Я использую Eclipse с компьютера с Windows XP и пытаюсь подключиться к этому приложению. Я открыл порт в окнах также.

Обе машины находятся в локальной сети, но я не могу подключить отладчик к приложению Java. Что я делаю не так?

dzidzitop
источник
stackoverflow.com/a/46171836/1619407
Алессандро Джиза
Совсем не дубликат. Во-первых, это более старый вопрос. Во-вторых, ответ на этот вопрос должен быть независим от среды отладки.
Аддисон

Ответы:

476

Редактировать: Я заметил, что некоторые люди сокращают и вставляют вызов здесь. Ответ, который я первоначально дал, был актуален только для ФП. Вот более современный стиль вызова (включая использование более обычного порта 8000):

java -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n <other arguments>

Оригинальный ответ следует.


Попробуй это:

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n myapp

Два момента здесь:

  1. В runjdwpопции нет пробелов .
  2. Опции идут перед именем класса. Любые аргументы после имени класса являются аргументами вашей программы!
Крис Шут-Янг
источник
2
@DJGummikuh Отлично! Я обновил пост, чтобы использовать -agentlibопцию более нового стиля для вашего удобства вырезания и вставки. :-)
Крис Шестер-Янг
Всегда ли нам нужен исходный код для удаленного приложения, присутствующего на компьютере, где мы выполняем удаленную отладку?
MasterJoe2
Вам нужно знать исходный код. Либо у вас есть файлы .java, либо файлы .jar / .class объединены с декомпилятором. В среде IDE, такой как Eclipse, может быть установлен декомпилятор, такой как JDecompiler, чтобы вы могли отлаживать файл .class, как если бы это был файл .java (исключая комментарии).
Иван Сатрия
1
Стоит повторить комментарий от этого stackoverflow.com/a/138518/500902 : «Поскольку Java 9« address = 1044 »не всегда прослушивает все интерфейсы.« Address = *: 1044 »заставляет Java 9+ вести себя как Java 8» для разрешить отладку с другого хоста
Marvin
84

Для JDK 1.3 или более ранней версии:

-Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006

Для JDK 1.4

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

Для новых JDK:

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

Пожалуйста, измените номер порта в зависимости от ваших потребностей.

Из техник Java

Начиная с версии 5.0 параметр -agentlib: jdwp используется для загрузки и указания параметров для агента JDWP. Для выпусков до 5.0 используются параметры -Xdebug и -Xrunjdwp (реализация 5.0 также поддерживает параметры -Xdebug и -Xrunjdwp, но более новая опция -agentlib: jdwp предпочтительнее, поскольку агент JDWP в 5.0 использует интерфейс TI JVM для виртуальная машина, а не старый интерфейс JVMDI)

Еще одна вещь, которую нужно отметить, от стоит документации интерфейса JVM Tool :

JVM TI был представлен в JDK 5.0. JVM TI заменяет интерфейс профилировщика виртуальной машины Java (JVMPI) и интерфейс отладки виртуальной машины Java (JVMDI), которые, начиная с JDK 6, больше не предоставляются.

Сайрам Криш
источник
Следующие параметры работают с настройками Eclipse по умолчанию: -agentlib: jdwp = transport = dt_socket, server = y, address = 8000
Sundae
29

шаги:

  1. Запустите ваше удаленное Java-приложение с параметрами отладки, как указано выше.
  2. Настройте Eclipse для удаленной отладки, указав хост и порт.
  3. Запустите удаленную отладку в Eclipse и дождитесь успешного подключения.
  4. Настройка точки останова и отладки.
  5. Если вы хотите отлаживать с самого начала приложения, используйте suspend = y, это будет держать приостановленное удаленное приложение, пока вы не подключитесь из eclipse.

См. Пошаговое руководство по удаленной отладке Java для более подробной информации.

Gaurav
источник
16

Ответ охватывает Java> = 9:

Для Java 9+, опция JVM нуждается в небольшом изменении, добавив в префикс адреса IP-адрес компьютера, на котором установлена ​​JVM, или просто *:

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

Это связано с изменением, отмеченным в https://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435 .

Для Java <9, номер порта достаточно для подключения.

М Аноути
источник
8

Я хотел бы подчеркнуть, что порядок аргументов важен .

Для меня java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar app.jarкоманда открывает порт отладчика ,

но java -jar app.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000команда не делает .

MrBlack
источник
3
Я думаю, это потому, что во втором примере все, что после app.jar, передается в качестве аргументов в ваш основной метод
xoX Zeus Xox
@xoXZeusXox ха-ха. Да, это прошло как аргументы. Спасибо за упоминание.
MrBlack
1

Вот как вы должны настроить Eclipse Debugger для удаленной отладки:

Настройки Eclipse:

1.Щелкните Run Кнопка
2.Установите Debug Configurations
3.Select «Дистанционное Java Application»
Конфигурация 4.New

  • Имя: GatewayPortalProject
  • Проект: GatewayPortal-портлет
  • Тип подключения: гнездо
  • Свойства соединения: i) localhost ii) 8787

Для JBoss:

1. Измените значение /path/toJboss/jboss-eap-6.1/bin/standalone.confв вашем виртуальном компьютере следующим образом: Раскомментируйте следующую строку, удалив #:

JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"

Для Tomcat:

В файле catalina.bat :

Шаг 1:

CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"

Шаг 2:

JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n"

Шаг 3: Запустите Tomcat из командной строки, как показано ниже:

catalina.sh jpda start

Затем вам нужно установить точки останова в классах Java, которые вы хотите отлаживать.

Притам Банерджи
источник
В Java 8 JDK поддерживает переменную среды JAVA_TOOL_OPTIONS, поэтому, чтобы включить отладчик для любого Java-приложения, которое вам нужно использовать: JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n ps извините за правки, борющиеся с форматером.
Натан Нисен