Remote-Debugging einer Java-Anwendung

254

Ich habe eine Java-Anwendung auf Linux-Computer ausgeführt. Ich führe die Java-Anwendung folgendermaßen aus:

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

Ich habe Port 4000 für TCP auf diesem Linux-Computer geöffnet. Ich verwende Eclipse von einem Windows XP-Computer und versuche, eine Verbindung zu dieser Anwendung herzustellen. Ich habe den Port auch in Windows geöffnet.

Beide Computer befinden sich im LAN, aber ich kann den Debugger anscheinend nicht mit der Java-Anwendung verbinden. Was mache ich falsch?

dzidzitop
quelle
Überhaupt kein Duplikat. Erstens ist dies eine ältere Frage. Zweitens sollte die Antwort auf diese Frage unabhängig von der Debugging-Umgebung sein.
Addison

Antworten:

476

Bearbeiten: Mir ist aufgefallen, dass einige Leute den Aufruf hier ausschneiden und einfügen. Die Antwort, die ich ursprünglich gab, war nur für das OP relevant. Hier ist ein moderner Aufrufstil (einschließlich der Verwendung des konventionelleren Ports 8000):

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

Die ursprüngliche Antwort folgt.


Versuche dies:

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

Zwei Punkte hier:

  1. Keine Leerzeichen in der runjdwp Option.
  2. Optionen stehen vor dem Klassennamen. Alle Argumente, die Sie nach dem Klassennamen haben, sind Argumente für Ihr Programm!
Chris Jester-Young
quelle
2
@ DJGummikuh Schön! Ich habe den Beitrag aktualisiert, um die neuere -agentlibOption für Ihr Ausschneiden und Einfügen zu verwenden. :-)
Chris Jester-Young
Müssen wir immer den Quellcode für die Remote-App haben, um auf dem Computer vorhanden zu sein, auf dem wir das Remote-Debugging durchführen?
MasterJoe2
Du musst es wissen , den Quellcode. Entweder haben Sie die .java-Dateien oder Sie haben die .jar / .class-Dateien mit dem Dekompiler kombiniert. In IDE wie Eclipse kann ein Dekompiler wie JDecompiler installiert sein, sodass Sie die .class-Datei so debuggen können, als wäre es eine .java-Datei (ohne die Kommentare).
Iwan Satria
1
Es lohnt sich, einen Kommentar von diesem stackoverflow.com/a/138518/500902 zu wiederholen : "Da Java 9" address = 1044 "nicht immer alle Schnittstellen abhört ." Address = *: 1044 " bewirkt , dass sich Java 9+ wie Java 8" verhält Debuggen von verschiedenen Hosts erlauben
Marvin
84

Für JDK 1.3 oder früher:

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

Für JDK 1.4

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

Für neuere JDK:

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

Bitte ändern Sie die Portnummer entsprechend Ihren Anforderungen.

Von Java-Technotes

Ab 5.0 wird die Option -agentlib: jdwp verwendet, um Optionen für den JDWP-Agenten zu laden und anzugeben. Für Releases vor 5.0 werden die Optionen -Xdebug und -Xrunjdwp verwendet (die 5.0-Implementierung unterstützt auch die Optionen -Xdebug und -Xrunjdwp, die neuere Option -agentlib: jdwp ist jedoch vorzuziehen, da der JDWP-Agent in 5.0 die JVM-TI-Schnittstelle verwendet die VM anstelle der älteren JVMDI-Schnittstelle)

Noch etwas zu beachten Dokumentation der JVM Tool-Benutzeroberfläche :

JVM TI wurde bei JDK 5.0 eingeführt. JVM TI ersetzt das Java Virtual Machine Profiler Interface (JVMPI) und das Java Virtual Machine Debug Interface (JVMDI), die ab JDK 6 nicht mehr bereitgestellt werden.

Sairam Krish
quelle
Das Folgende funktioniert mit den Standardeinstellungen von Eclipse: -agentlib: jdwp = transport = dt_socket, server = y, address = 8000
Sundae
29

Schritte:

  1. Starten Sie Ihre Remote-Java-Anwendung mit Debugging-Optionen, wie im obigen Beitrag beschrieben.
  2. Konfigurieren Sie Eclipse für das Remote-Debugging, indem Sie Host und Port angeben.
  3. Starten Sie das Remote-Debugging in Eclipse und warten Sie, bis die Verbindung erfolgreich ist.
  4. Haltepunkt einrichten und debuggen.
  5. Wenn Sie vom Start der Anwendung an debuggen möchten, verwenden Sie suspend = y, wodurch die Remote-Anwendung angehalten bleibt, bis Sie eine Verbindung über Eclipse herstellen.

Ausführliche Informationen finden Sie in der Schritt-für-Schritt-Anleitung zum Java-Remote-Debugging .

Gaurav
quelle
16

Antwort zu Java> = 9:

Für Java 9+ muss die JVM-Option geringfügig geändert werden, indem der Adresse die IP-Adresse des Computers vorangestellt wird, auf dem sich die JVM befindet, oder einfach *:

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

Dies ist auf eine Änderung zurückzuführen, die unter https://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435 vermerkt ist .

Für Java <9 reicht die Portnummer aus, um eine Verbindung herzustellen.

M Anouti
quelle
8

Ich möchte betonen, dass die Reihenfolge der Argumente wichtig ist .

Für mich öffnet derjava -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar app.jar Befehl den Debugger-Port ,

aber java -jar app.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000Befehl nicht .

Herr Schwarz
quelle
3
Ich würde vermuten, dass in Ihrem zweiten Beispiel alles nach "app.jar" als Argumente an Ihre Hauptmethode übergeben wird
xoX Zeus Xox
@xoXZeusXox ha ha. Ja, es wurde als Argument übergeben. Vielen Dank für die Erwähnung.
MrBlack
1

So sollten Sie den Eclipse-Debugger für das Remote-Debugging einrichten:

Eclipse-Einstellungen:

1.Klicken Sie auf die Schaltfläche Ausführen.
2.Wählen Sie die Debug-Konfigurationen.
3.Wählen Sie die „Remote-Java-Anwendung“.
4.Neue Konfiguration

  • Name: GatewayPortalProject
  • Projekt: GatewayPortal-Portlet
  • Verbindungstyp: Socket Attach
  • Verbindungseigenschaften: i) localhost ii) 8787

Für JBoss:

1.Ändern Sie das /path/toJboss/jboss-eap-6.1/bin/standalone.confin Ihrem VM wie folgt: Kommentieren Sie die folgende Zeile aus, indem Sie das # entfernen:

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

Für Tomcat:

In der Datei catalogina.bat :

Schritt 1:

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

Schritt 2:

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

Schritt 3: Führen Sie Tomcat an der Eingabeaufforderung wie folgt aus:

catalina.sh jpda start

Dann müssen Sie Haltepunkte in den Java-Klassen festlegen, die Sie debuggen möchten.

Pritam Banerjee
quelle
In Java 8 unterstützt das JDK eine Umgebungsvariable JAVA_TOOL_OPTIONS , damit der Debugger für jede Java-Anwendung aktiviert werden kann, die Sie verwenden müssen: JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n ps Entschuldigung für die Änderungen, Kampf mit dem Formatierer.
Nathan Niesen