Welche Java-Befehlszeilenoptionen müssen festgelegt werden, damit JVM remote debuggt werden kann?


321

Ich weiß, dass einige JAVA_OPTSfestgelegt werden müssen, um ein Java-Programm remote zu debuggen.

Was sind sie und was bedeuten sie?

Antworten:


303

Ich habe diesen Artikel mit einem Lesezeichen versehen, um ihn für Java 5 und niedriger einzurichten.

Grundsätzlich läuft es mit :

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

Führen Sie es für Java 5 und höher aus mit:

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

19
Erwähnenswert ist, dass Sie Ihre Adresse möglicherweise so konfigurieren möchten, *:1044dass das Remote-Debugging von jedem Computer aus aktiviert wird
Herr Derb,

6
HerrDerb hat recht .. Da Java 9 "address = 1044" nicht immer alle Schnittstellen abhört. "address = *: 1044" lässt Java 9+ sich wie Java 8 verhalten ...
alfonx

459

Vor Java 5.0 verwenden -Xdebugund -XrunjdwpArgumente. Diese Optionen funktionieren in späteren Versionen weiterhin, werden jedoch im interpretierten Modus anstelle von JIT ausgeführt, das langsamer ist.

Ab Java 5.0 ist es besser, die -agentlib:jdwpeinzige Option zu verwenden:

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

Optionen -Xrunjdwpoder agentlib:jdwpArgumente sind:

  • transport=dt_socket : bedeutet die Art und Weise, wie eine Verbindung zu JVM hergestellt wird (Socket ist eine gute Wahl, kann zum Debuggen eines entfernten Computers verwendet werden)
  • address=8000 : TCP / IP-Port verfügbar gemacht, um eine Verbindung vom Debugger herzustellen,
  • suspend=y : Wenn 'y', weisen Sie die JVM an, zu warten, bis der Debugger angeschlossen ist, um mit der Ausführung zu beginnen. Andernfalls (wenn 'n') wird die Ausführung sofort gestartet.

7
Sie sind genau richtig. Ich habe es mit -Xdebug und -Xrunjdwp versucht, aber es hat nicht funktioniert. als ich es mit -Xrunjdwp oder agentlib versuchte : jdwp Es funktioniert. (auf Java 7)
RoboAlex

Dies hat bei mir nur funktioniert, wenn ich Anführungszeichen gesetzt habe, andernfalls wurde folgende Fehlermeldung angezeigt: FEHLER: JDWP-Nicht-Server-Transport dt_socket server = y suspend = y address = 8000 muss eine Verbindungsadresse haben, die durch die Option 'address ='
Ring angegeben wird

1
Ist Xrunjdwpveraltet (oder entfernt?), Warum sollten wir darüber nachdenken agentlib:jdwp?
ArtOfWarfare

2
Ich denke du liegst falsch. Netbeans wird -Xdebug -Xrunjdwpbeim Debuggen von Maven-Projekten verwendet und sie werden so ausgeführt, als wären sie JITed.
Aleksandr Dubinsky

77

Seit Java 9.0 unterstützt JDWP standardmäßig nur lokale Verbindungen. http://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435

Für das Remote-Debugging sollte ein Programm mit der folgenden *:Adresse ausgeführt werden:

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

1
Dies sollte mehr positive Stimmen erhalten, da dies ein wichtiger Hinweis ist, der für alle neuen Java-Versionen gilt.
Sebastian S

1
Nur eine Notiz machen: Der Oracle-Link sagt, dass dies das gleiche alte Verhalten erreichen wird, aber es ist nicht sicher und wird nicht empfohlen.
Chanseok Oh

9

Für Java 1.5 oder höher:

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

Für Java 1.4:

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

Für Java 1.3:

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

Hier wird von einem einfachen Programm ausgegeben:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044 HelloWhirled
Listening for transport dt_socket at address: 1044
Hello whirled

5

Java

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

address Gibt den Port an, an dem das Debuggen möglich ist

Maven

** Spring Boot App mit Maven debuggen:

mvn spring-boot:run -Drun.jvmArguments=**"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8001"

2

Hier ist die einfachste Lösung.

Wenn Sie Maven verwenden, sind viele spezielle Umgebungskonfigurationen erforderlich. Wenn Sie Ihr Programm also von maven aus starten, führen Sie mvnDebugstattdessen einfach den Befehl ausmvn wird Ihre App mit konfiguriertem Remote-Debugging gestartet. Jetzt können Sie einfach einen Debugger an Port 8000 anschließen.

Es kümmert sich um alle Umweltprobleme für Sie.


1

Befehlszeile

-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

1
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER

Hier verwenden wir nur einen Socket Attaching Connector, der standardmäßig aktiviert ist, wenn der Transport dt_socket konfiguriert ist und die VM im Server-Debugging-Modus ausgeführt wird.

Weitere Informationen finden Sie unter: https://stackify.com/java-remote-debugging/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.