Java-Remote-Debugging
- Voraussetzungen
- Erstellen Sie eine Java-Anwendung
- Schreiben Sie Java-Code
- Java-Remote-Debugging
- Führen Sie die Java-Anwendung aus
- Debugger an einen Prozess anhängen
- Java-Debug-Wire-Protokoll
Wir müssen eine Java-Anwendung mit bestimmten Parametern ausführen, damit ein Remote-Debugger angehängt werden kann. Wir werden untersuchen, wie Run/Debug-Konfigurationen eingerichtet werden, die die Arbeit für uns erledigen.
Voraussetzungen
Um diesem Tutorial zu folgen, müssen wir die folgenden Dinge am Laufen haben.
- Java 18 und die Umgebungsvariable müssen gesetzt sein.
- IntelliJ IDEA Community Edition IDE (Sie können es auch hier herunterladen).
- Die IP-Adresse und Portnummer eines Remote-Computers (Sie können auch diesem Artikel folgen, wenn Sie auf dem lokalen Computer arbeiten)
Das verbleibende Tutorial ist unter Berücksichtigung der Neulinge für diese IDE in sechs Abschnitte unterteilt. Wenn Sie IntelliJ IDEA bereits verwenden, können Sie zum gewünschten Abschnitt springen; alle von ihnen sind unten angegeben.
- Java-Anwendung erstellen
- [Java-Code schreiben](##Java-Code schreiben)
- Java-Remote-Debugging
- [Java-Anwendung ausführen](##Java-Anwendung ausführen)
- Debugger an einen Prozess anhängen
- Java Debug Wire Protocol
Erstellen Sie eine Java-Anwendung
Schritt 1: Öffnen Sie die IntelliJ IDEA IDE.
Schritt 2: Klicken Sie auf Datei -> Neu -> Projekt. Der folgende Bildschirm wird angezeigt, klicken Sie auf Neues Projekt
, geben Sie den Namen des Projekts ein und legen Sie den Speicherort fest.
Stellen Sie sicher, dass die Sprache Java
und das Build-System IntelliJ
ausgewählt sind. IntelliJ IDEA erkennt automatisch, ob Sie JDK (Java Development Kit) am Standardspeicherort installiert haben.
Andernfalls können Sie nach JDK suchen und es von hier herunterladen, ohne zum Browser zu navigieren. Klicken Sie abschließend auf die Schaltfläche Erstellen
.
Schritt 3: Erstellen Sie eine Java-Klasse, indem Sie mit der rechten Maustaste auf src
Ordner -> Neu -> Java-Klasse klicken.
Schreiben Sie den Namen der Java-Klasse. Wenn Sie nur den Namen schreiben, wird dieser im Standardpaket
erstellt.
Um eine Java-Klasse in Ihrem gewünschten Paket zu erstellen, schreiben Sie den Namen wie folgt. Es erstellt ein Paket und eine Datei mit den Namen com.company.remotedebugging
bzw. RemoteDebugging.java
.
Schreiben Sie Java-Code
Beispielcode:
// You may have a different package name. Write yours here
package com.company.remotedebugging;
// RemoteDebugging class
public class RemoteDebugging {
// main method
public static void main(String[] args) {
String fullName = "Mehvish Ashiq";
System.out.println("Star Printing");
// iterate over the string variable
for (int i = 0; i < fullName.length(); i++) {
try {
// sleep for 500 milliseconds
Thread.sleep(500);
} // end try
catch (InterruptedException e) {
e.printStackTrace();
} // end catch
// print character
System.out.println(fullName.charAt(i));
} // end for-loop
System.out.println("Task Completed!");
} // end main function
} // end RemoteDebugging Class
Java-Remote-Debugging
Wir müssen nur zwei Run/Debug-Konfigurationen vornehmen, erstens zum Ausführen der Anwendung und zweitens zum Anhängen an sie. Mal sehen, wie wir das machen können.
Debugger einrichten
Schritt 1: Gehen Sie zu Ausführen -> Konfigurationen bearbeiten.
Schritt 2: Klicken Sie oben links auf das +
-Zeichen und wählen Sie Remote JVM Debug
.
Schritt 3: Wir konfigurieren ein paar Dinge. Schreiben Sie zuerst den Namen, um zu sagen, wie diese run
-Konfiguration aufgerufen wird.
Sie können auch den Standardwert verwenden, aber es ist gut, einen anderen Namen zur Unterscheidung zu haben. Stellen Sie sicher, dass bei den Optionen Debugger-Modus
und Transport
die Optionen Attach to remote JVM
und Socket
ausgewählt sind.
Schreiben Sie als Nächstes die IP-Adresse eines Computers, auf dem diese App ausgeführt wird. Wir werden localhost
schreiben, wenn wir auf derselben Maschine ausführen.
Denken Sie daran, dass wir die IP-Adresse schreiben, wenn die Anwendung auf einem anderen Computer ausgeführt wird. Zum Beispiel sieht die IP wie 192.168.15.119
aus.
Geben Sie dann die Portnummer ein, die Sie für eine Remoteverbindung offen halten möchten. Kopieren Sie nun die Befehlszeilenargumente in einen Editor (dies wird später in diesem Tutorial verwendet).
Diese VM-Optionen werden von einer zu startenden Hostanwendung benötigt. Klicken Sie auf Übernehmen
und dann auf OK
.
Sehen Sie sich den folgenden Screenshot als Referenz an.
Hostanwendung einrichten
Wir verwenden die Run/Debug-Konfigurationen, um unsere Host-Anwendung einzurichten, aber es gibt keine Einschränkungen dafür, wie die Host-App ausgeführt werden soll.
Klicken Sie mit der rechten Maustaste auf eine beliebige Stelle im Hauptteil Ihrer Java-Klasse (in diesem Beispiel ist die Java-Klasse RemoteDebugging.java
) und wählen Sie Modify Run Configuration
. Der folgende Bildschirm wird angezeigt.
Klicken Sie auf Optionen ändern
und wählen Sie VM-Optionen hinzufügen
, was den folgenden Bildschirm öffnet. Schreiben Sie die Befehlszeilenargumente, die Sie beim Einrichten des Debuggers in den Editor kopiert haben, und fügen Sie sie wie im folgenden Screenshot angegeben ein.
Klicken Sie abschließend auf Übernehmen
und anschliessend auf OK
.
Führen Sie die Java-Anwendung aus
Führen Sie die Anwendung aus, indem Sie zu Ausführen -> Ausführen gehen. Stellen Sie sicher, dass Ihre Java-Klasse ausgewählt ist.
Die erste Zeile in der Programmausgabe muss wie folgt aussehen.
Überwachen des Transports dt_socket unter der Adresse: 5005
Es zeigt, dass wir einen Debug-Agent erfolgreich aktiviert haben. Jetzt ist unser Java-Programm bereit, die eingehenden Debugger-Verbindungen zu akzeptieren.
Debugger an einen Prozess anhängen
Klicken Sie in der Zeile, in der Sie den Haltepunkt hinzufügen möchten, auf den Bundsteg. Wir fügen den Haltepunkt in der folgenden Zeile hinzu, die im folgenden Screenshot hervorgehoben ist.
Führen Sie die Anwendung aus, indem Sie wie im vorherigen Abschnitt zu Ausführen -> Ausführen gehen. Klicken Sie in der Programmausgabe auf Debugger anhängen
.
Sie finden es wie im folgenden Screenshot gezeigt.
Der Debugger wurde erfolgreich angefügt.
Infolgedessen wird das Programm ausgesetzt, sobald es den Haltepunkt erreicht. Sie können alle Debugging-bezogenen Aktionen ausführen, z. B. Ausdrucksauswertung.
Wenn Sie fertig sind, vergessen Sie nicht, die Debugger-Sitzung zu schließen, indem Sie die Sitzungsregisterkarte im Werkzeugfenster Debuggen
schließen oder auf das rote Quadrat
links klicken, um sie zu stoppen.
Java-Debug-Wire-Protokoll
Das Java Debug Wire Protocol (auch JDWP
genannt) ist ein Protokoll, das für die Kommunikation zwischen einem Debugger und einem debuggee
verwendet wird. Hier ist der debuggee
eine Anwendung, die debuggt wird, während ein Debugger ein Prozess ist, der eine Verbindung zu einer Anwendung herstellt, die debuggt wird.
Denken Sie daran, dass beide Anwendungen auf verschiedenen oder demselben Computer ausgeführt werden können. Wir haben JDWP
in den JVM-Befehlszeilenargumenten verwendet, um die debuggee
-Anwendung zu starten.
Es erfordert verschiedene Parameter (Optionen), die im Folgenden kurz beschrieben werden.
- Der
transport
ist die einzige vollständig benötigte Option. Es gibt an, welcher Transportmechanismus verwendet werden würde. Wir verwendendt_socket
, das mit jeder Plattform kompatibel ist und die Prozesse auf verschiedenen Maschinen laufen lässt. Im Gegensatz dazu wirddt_shmem
verwendet, wenn beide Prozesse auf derselben Maschine ausgeführt werden und wir nur unter Windows arbeiten möchten. - Die Option
server
ist nicht obligatorisch. Wenn dieses Flag aktiviert ist, definiert es, wie es an einen Debugger angehängt wird. Es offenbart einen Prozess, durch den die Adresse in einerAdresse
-Option definiert wird. Andernfalls zeigtJDWP
die Standardeinstellung an. - Die Option
suspend
legt fest, ob eine JVM (Java Virtual Machine) suspendiert und auf das Anhängen des Debuggers warten soll oder nicht. - Die Option
Adresse
hat die Adresse und eine Portnummer, die von einem Debuggee bekannt gegeben werden. Dies kann auch eine Adresse bezeichnen, die in eine Zeichenfolge übersetzt wurde (z. B.javadebug
, wenn wirserver=y
verwenden, ohne dieAdresse
unter Windows anzugeben).