Удаленная отладка приложения Java
-
13-09-2019 - |
Вопрос
У меня есть Java-приложение, работающее на Linux-машине.Я запускаю Java-приложение, используя следующее:
java myapp -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000, suspend=n
Я открыл порт 4000 для TCP на этой машине с Linux.Я использую eclipse с компьютера с Windows XP и пытаюсь подключиться к этому приложению.Я также открыл порт в Windows.
Обе машины подключены к локальной сети, но я не могу подключить отладчик к приложению Java.Что я делаю не так?
Решение
Редактировать: Я заметил, что некоторые люди вырезают и вставляют сюда призыв.Ответ, который я изначально дал, касался только ОП.Вот более современный стиль вызова (включая использование более традиционного порта 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
Здесь два момента:
- Нет пробелов в
runjdwp
вариант. - Опции идут перед именем класса.Любые аргументы после имени класса являются аргументами вашей программы!
Другие советы
Для 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
Пожалуйста, измените номер порта в соответствии с вашими потребностями.
Начиная с 5.0. Опция -AgentLib: JDWP используется для загрузки и указания параметров агенту JDWP.Для выпусков до 5.0 используются параметры -xdebug и -xrunjdwp (реализация 5.0 также поддерживает параметры -xdebug и -xrunjdwp, но более новая опция jdwp: jdwp предпочтительнее, поскольку агент jdwp использует интерфейс jvm ti к VM, а не старый интерфейс JVMDI)
Еще одна вещь, на которую следует обратить внимание, из Документация по интерфейсу инструмента JVM:
JVM TI был представлен в JDK 5.0.JVM TI заменяет интерфейс профилировщика виртуальной машины Java (JVMPI) и интерфейс отладки виртуальной машины Java (JVMDI), которые, начиная с JDK 6, больше не предоставляются.
Шаги:
- Запустите удаленное Java-приложение с параметрами отладки, как указано в сообщении выше.
- Настройте Eclipse для удаленной отладки, указав хост и порт.
- Запустите удаленную отладку в Eclipse и дождитесь успешного подключения.
- Установите точку останова и отладьте.
- Если вы хотите выполнить отладку с самого начала приложения, используйте suspend=y , это приведет к приостановке удаленного приложения до тех пор, пока вы не подключитесь из eclipse.
Видеть Пошаговое руководство по удаленной отладке Java для получения полной информации.
Ответ, касающийся 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 номера порта достаточно для подключения.
Вот как вам следует настроить Eclipse Debugger для удаленной отладки:
Настройки затмения:
1.Нажмите кнопку «Выполнить».
2.Выберите конфигурации отладки.
3.Выберите «Удаленное приложение Java».
4.Новая конфигурация
- Имя :ШлюзПорталПроект
- Проект :Портлет GatewayPortal
- Тип соединения:Розетка Прикрепить
- Свойства соединения:i) локальный хост 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"
Для Томката:
В каталина.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 -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
команда не делает.
Лучший вариант отладки — создание и анализ логов.Но в некоторых случаях нам необходимо отладить веб-приложение, развернутое на сервере.
Видеть Удаленная отладка веб-приложения Java связь.Полный процесс удаленной отладки описан здесь.Надеюсь, это поможет.