Віддалена налагодження програми Java


254

У мене програма Java працює на машині Linux. Я запускаю програму java, використовуючи наступне:

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

Я відкрив порт 4000 для TCP на цій машині Linux. Я використовую затемнення з машини Windows XP і намагаюся підключитися до цього додатку. Я також відкрив порт у windows.

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




Зовсім не дублікат. По-перше, це питання старішого. По-друге, відповідь на це питання має бути агностиком середовища налагодження.
Аддісон

Відповіді:


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" адреса = 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 використовує інтерфейс JVM TI для VM, а не старіший інтерфейс JVMDI)

Ще одне, що слід зазначити, з документації на інтерфейс інструменту JVM Tool :

JVM TI був представлений у JDK 5.0. JVM TI замінює інтерфейс профіля Java Virtual Machine Profiler (JVMPI) та інтерфейс налагодження Java Virtual Machine (JVMDI), які станом на JDK 6 більше не надаються.


З налаштуваннями Eclipse за замовчуванням працює наступне: -agentlib: jdwp = transport = dt_socket, сервер = y, адреса = 8000
Sundae

29

Кроки:

  1. Запустіть свою віддалену програму Java з налаштуваннями налагодження, як сказано вище у публікації.
  2. Налаштуйте Eclipse для віддаленої налагодження, вказавши хост і порт.
  3. Почніть віддалену налагодження в Eclipse та дочекайтеся успішного підключення.
  4. Встановіть точку розриву та налагодження.
  5. Якщо ви хочете налагоджувати помилку від запуску програми, використовуйте suspend = y, це зупинить віддалену програму, доки ви не підключитесь із затемнення.

Детальні відомості див. У посібнику "Крок за кроком" щодо віддаленої налагодження Java .


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команда ні .


3
Я б припускав, що це тому, що у вашому другому прикладі все після "app.jar" передається як аргументи у ваш основний метод
xoX Zeus Xox

@xoXZeusXox ха-ха. Так, це передано як аргументи. Дякуємо за згадування.
MrBlack

1

Ось як слід налаштувати налагоджувач Eclipse для віддаленої налагодження:

Налаштування затемнення:

1. Клацніть кнопку Запустити
2.Виберіть конфігурації налагодження
3.Виберіть "Віддалений додаток Java"
4.Нова конфігурація

  • Ім'я: GatewayPortalProject
  • Проект: GatewayPortal-портлет
  • Тип з'єднання: Розетка
  • Властивості підключення: i) localhost ii) 8787

Для JBoss:

1.Змініть /path/toJboss/jboss-eap-6.1/bin/standalone.confв своєму vm наступним чином: Відмініть наступний рядок, видаливши #:

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 вибачте за зміни, бореться з форматором.
Натан Нізен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.