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

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

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

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

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

9 ответов

Решение

Редактировать: Я заметил, что некоторые люди сокращают и вставляют вызов здесь. Ответ, который я первоначально дал, был актуален только для ФП. Вот более современный стиль вызова (включая использование более обычного порта 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. Опции идут перед именем класса. Любые аргументы после имени класса являются аргументами вашей программы!

Для 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, больше не предоставляются.

Ответ для 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.

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

Шаги:

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

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

Подчеркну, что порядок аргументов важен.

Для меня 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команда не работает.

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

Настройки Eclipse:

1.Нажмите кнопку "Выполнить"
2. Выберите настройки отладки.
3. Выберите "Удаленное Java-приложение".
4.Новая конфигурация

  • Имя: 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, которые вы хотите отлаживать.

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

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

недостаточно, потому что теперь это привязывается (по крайней мере, на машинах unix/osx) к localhost, поэтому вы можете подключаться к нему только с localhost.

Если вы попытаетесь выполнить удаленную отладку, вам будет отказано в соединении. Я думаю, что Java 9 вам нужно сделать:

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

или дайте IP-адрес, который нужно привязать для шляпы *

Каждое решение здесь описывает метод подключения отладчика после запуска приложения. В настройке «прослушивания отладчика» вам необходимо установить server=n и suspend=n. В противном случае Gradle выдаст ошибку отказа в доступе.

build.gradle:

      run {
    jvmArgs = ["-agentlib:jdwp=transport=dt_socket,server=n,suspend=n,address=5005"
}

Лучший вариант отладки - создавать журналы и анализировать журналы. Но в некоторых случаях нам нужно отлаживать веб-приложение, развернутое на сервере.

См. Удаленная отладка ссылки на веб-приложение Java. Полный поток удаленной отладки описан здесь. Надеюсь, это поможет.

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