Jakie opcje wiersza poleceń Java należy ustawić, aby umożliwić zdalne debugowanie JVM?

321

Wiem, że jest trochę JAVA_OPTS ustawień do zdalnego debugowania programu Java.

Czym oni są i co mają na myśli?

paulgreg
źródło

Odpowiedzi:

303

Mam ten artykuł zakładką na ustawienie to dla Java 5 i poniżej.

Zasadniczo uruchom go z :

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

W przypadku języka Java 5 i nowszych uruchom go z:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044
Hans Sjunnesson
źródło
19
Warto wspomnieć, że możesz chcieć skonfigurować swój adres tak, *:1044aby umożliwić zdalne debugowanie z dowolnego komputera
Herr Derb
6
HerrDerb ma rację .. Ponieważ Java 9 „adres = 1044” nie zawsze nasłuchuje na wszystkich interfejsach. „address = *: 1044” sprawia, że ​​Java 9+ zachowuje się jak Java 8 ...
alfonx
459

Przed wersją Java 5.0 użyj -Xdebugi-Xrunjdwp argumenty. Te opcje będą nadal działać w późniejszych wersjach, ale będą działać w trybie interpretowanym zamiast JIT, który będzie wolniejszy.

W Javie 5.0 lepiej jest użyć -agentlib:jdwpjednej opcji:

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

Dostępne opcje -Xrunjdwplub agentlib:jdwpargumenty to:

  • transport=dt_socket : oznacza sposób połączenia z JVM (gniazdo jest dobrym wyborem, można go użyć do debugowania odległego komputera)
  • address=8000 : Port TCP / IP jest otwarty, aby połączyć się z debuggera,
  • suspend=y : jeśli „y”, powiedz JVM, aby poczekał, aż debuger zostanie podłączony, aby rozpocząć wykonywanie, w przeciwnym razie (jeśli „n”) rozpocznie wykonywanie natychmiast.
paulgreg
źródło
7
Masz dokładnie rację. Próbowałem z -Xdebug i -Xrunjdwp, ale to nie działało. kiedy próbowałem z -Xrunjdwp lub agentlib: jdwp Działa. (w Javie 7)
RoboAlex
To działało tylko dla mnie, gdy wstawiłem cudzysłowy, w przeciwnym razie dostaję ten błąd: BŁĄD: JDWP Transport inny niż serwer dt_socket serwer = y wstrzymaj = y adres = 8000 musi mieć adres połączenia określony za pomocą opcji 'adres ='
Pierścień
1
Czy jest Xrunjdwpprzestarzałe (czy usunięte?), Dlaczego mielibyśmy to zmienić agentlib:jdwp?
ArtOfWarfare
2
Myślę, że jesteś w błędzie. Netbeans używa -Xdebug -Xrunjdwppodczas debugowania projektów Maven i działają one tak, jakby były JITed.
Aleksandr Dubinsky
78

Ponieważ Java 9.0 JDWP domyślnie obsługuje tylko połączenia lokalne. http://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435

W celu zdalnego debugowania należy uruchomić program z *:adresem:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000
Antony Shumskikh
źródło
1
Powinno to uzyskać więcej pozytywnych opinii, ponieważ jest to ważna wskazówka, która dotyczy wszystkich nowych wersji Java.
Sebastian S,
1
Po prostu zanotuj: link Oracle mówi, że osiągnie to samo stare zachowanie, ale nie jest bezpieczne i nie jest zalecane.
Chanseok Oh
9

W przypadku wersji Java 1.5 lub nowszej:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

W przypadku java 1.4:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

W przypadku java 1.3:

java -Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

Oto dane wyjściowe z prostego programu:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044 HelloWhirled
Listening for transport dt_socket at address: 1044
Hello whirled
thebiggestlebowski
źródło
5

Jawa

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8001,suspend=y -jar target/cxf-boot-simple-0.0.1-SNAPSHOT.jar

address określa port, przy którym pozwoli na debugowanie

Maven

** Aplikacja Debugowanie Spring Boot z Maven:

mvn spring-boot:run -Drun.jvmArguments=**"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8001"
Jovi Qiao
źródło
2

Oto najprostsze rozwiązanie.

Jeśli korzystasz z Maven, potrzebujesz wielu specjalnych konfiguracji środowiska. Jeśli więc uruchomisz program z maven, po prostu uruchom mvnDebugpolecenie zamiastmvn , zajmie się uruchomieniem aplikacji ze skonfigurowanym zdalnym debugowaniem. Teraz możesz po prostu podłączyć debuger do portu 8000.

Zajmie się wszystkimi problemami środowiska.

Neves
źródło
1

Wiersz poleceń

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

Gradle

gradle bootrun --debug-jvm

Maven

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER
Santosh b
źródło
1
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER

Tutaj używamy tylko Socket Attaching Connector, który jest domyślnie włączony, gdy skonfigurowany jest transport dt_socket, a maszyna wirtualna działa w trybie debugowania serwera.

Więcej informacji można znaleźć na stronie : https://stackify.com/java-remote-debugging/

Boney
źródło