Zdalne debugowanie aplikacji Java

254

Mam aplikację Java uruchomioną na komputerze z systemem Linux. Uruchamiam aplikację Java przy użyciu następujących opcji:

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

Na tym komputerze z systemem Linux otworzyłem port 4000 dla TCP. Korzystam z Eclipse z komputera z systemem Windows XP i próbuję połączyć się z tą aplikacją. Otworzyłem również port w systemie Windows.

Oba komputery są w sieci LAN, ale nie mogę połączyć debugera z aplikacją Java. Co ja robię źle?

dzidzitop
źródło
W ogóle nie jest duplikatem. Po pierwsze, jest to starsze pytanie. Po drugie, odpowiedź na to pytanie powinna być agnostyczna dla środowiska debugowania.
Addison

Odpowiedzi:

476

Edycja: Zauważyłem, że niektórzy ludzie wycinają i wklejają tutaj wywołanie. Odpowiedź, którą pierwotnie udzieliłem, była istotna tylko dla PO. Oto bardziej nowoczesny styl wywoływania (w tym korzystanie z bardziej konwencjonalnego portu 8000):

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

Oryginalna odpowiedź następuje.


Spróbuj tego:

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

Dwa punkty tutaj:

  1. Brak spacji w runjdwpopcji.
  2. Opcje pojawiają się przed nazwą klasy. Wszelkie argumenty, które masz po nazwie klasy, są argumentami twojego programu!
Chris Jester-Young
źródło
2
@DJGummikuh Nice! Zaktualizowałem post, aby użyć opcji w nowym stylu -agentlibdla przyjemności cięcia i wklejania. :-)
Chris Jester-Young,
Czy zawsze musimy mieć kod źródłowy, aby aplikacja zdalna była obecna na komputerze, na którym przeprowadzamy zdalne debugowanie?
MasterJoe2
Musisz znać kod źródłowy. Masz pliki .java lub pliki .jar / .class połączone z dekompilatorem. IDE, takie jak Eclipse, może mieć zainstalowany dekompilator, taki jak JDecompiler, dzięki czemu można debugować plik .class tak, jakby był plikiem .java (z wyłączeniem komentarzy).
Iwan Satria
1
Warto powtórzyć komentarz z tego stackoverflow.com/a/138518/500902 , „Od Java 9” adres = 1044 ”nie zawsze nasłuchuje na wszystkich interfejsach.” Address = *: 1044 ”sprawia, że ​​Java 9+ zachowuje się jak Java 8” do zezwól na debugowanie z innego hosta
Marvin
84

W przypadku JDK 1.3 lub wcześniejszej:

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

Dla JDK 1.4

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

W przypadku nowszej wersji JDK:

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

Zmień numer portu w zależności od potrzeb.

Od java technotes

Począwszy od 5.0, opcja -agentlib: jdwp służy do ładowania i określania opcji agenta JDWP. W wersjach wcześniejszych niż 5.0 używane są opcje -Xdebug i -Xrunjdwp (implementacja 5.0 obsługuje również opcje -Xdebug i -Xrunjdwp, ale nowsza opcja -agentlib: jdwp jest lepsza, ponieważ agent JDWP w wersji 5.0 używa interfejsu JVM TI do maszyna wirtualna zamiast starszego interfejsu JVMDI)

Jeszcze jedna rzecz do zapamiętania, z dokumentacji interfejsu JVM Tool :

JVM TI został wprowadzony w JDK 5.0. Interfejs JVM TI zastępuje interfejs Java Virtual Machine Profiler Interface (JVMPI) i interfejs Java Virtual Machine Debug Interface (JVMDI), które od wersji JDK 6 nie są już dostępne.

Sairam Krish
źródło
Następujące prace z ustawieniami domyślnymi Eclipse: -agentlib: JDWP = transportowa = dt_socket, server = y, address = 8000
Sundae
29

Kroki:

  1. Uruchom zdalną aplikację Java z opcjami debugowania, jak wspomniano powyżej.
  2. Skonfiguruj Eclipse do zdalnego debugowania, określając host i port.
  3. Rozpocznij zdalne debugowanie w środowisku Eclipse i poczekaj na nawiązanie połączenia.
  4. Ustaw punkt przerwania i debuguj.
  5. Jeśli chcesz debugować od początku aplikacji, użyj suspend = y, spowoduje to zawieszenie aplikacji zdalnej do momentu połączenia z Eclipse.

Aby uzyskać szczegółowe informacje, zobacz Przewodnik krok po kroku dotyczący zdalnego debugowania Java .

Gauraw
źródło
16

Odpowiedź obejmująca Javę> = 9:

W przypadku Java 9+ opcja JVM wymaga niewielkiej zmiany, poprzedzając adres adresem IP maszyny obsługującej JVM, lub po prostu *:

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

Jest to spowodowane zmianą odnotowaną w https://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435 .

W przypadku Java <9 wystarczy numer portu, aby się połączyć.

M. Anouti
źródło
8

Chciałbym podkreślić, że kolejność argumentów jest ważna .

Dla mnie java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar app.jarpolecenie otwiera port debugera ,

ale java -jar app.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000polecenie nie .

Pan Black
źródło
3
Sądzę, że dzieje się tak, ponieważ w drugim przykładzie wszystko po „app.jar” jest przekazywane jako argumenty do głównej metody
xoX Zeus Xox,
@xoXZeusXox ha ha. Tak, przekazano jako argumenty. Dzięki za wzmiankę.
MrBlack
1

Oto jak powinieneś skonfigurować Eclipse Debugger do zdalnego debugowania:

Ustawienia Eclipse:

1. Kliknij przycisk Uruchom
2. Wybierz konfiguracje debugowania
3. Wybierz „Zdalna aplikacja Java”
4. Nowa konfiguracja

  • Nazwa: GatewayPortalProject
  • Projekt: portlet portletowy
  • Typ połączenia: Socket Attach
  • Właściwości połączenia: i) localhost ii) 8787

W przypadku JBoss:

1. Zmień /path/toJboss/jboss-eap-6.1/bin/standalone.confvm w następujący sposób: Usuń komentarz z następującego wiersza, usuwając #:

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

W przypadku Tomcat:

W pliku catalina.bat :

Krok 1:

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

Krok 2:

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

Krok 3: Uruchom Tomcat z wiersza polecenia, jak poniżej:

catalina.sh jpda start

Następnie musisz ustawić punkty przerwania w klasach Java, które chcesz debugować.

Pritam Banerjee
źródło
W Javie 8 JDK obsługuje zmienną środowiskową JAVA_TOOL_OPTIONS , aby umożliwić debugowanie dowolnej aplikacji Java, której musisz użyć: JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n ps przepraszamy za zmiany, walczę z formatyzatorem.
Nathan Niesen