Java-Anwendung remote debuggen (mit Eclipse)
Manchmal funktioniert ein Programm auf einem Rechner und auf einem anderen wiederrum nicht. So wie bei mir neulich: XP macht bspw. keinen Unterschied bei der Groß-/Kleinschreibung von Dateinamen, Ubuntu schon.
Durch einen Denkfehler lief lokal auf XP alles einwandfrei, auf dem Server wurde eine Exception beim Dateizugriff geworfen. Natürlich kann man dabei möglichst viel in die Standardausgabe schreiben und so den Fehler lokalisieren, aber in so gut wie jedem Fall ist es einfacher und sinnvoller einen Debugger zu verwenden.
Um die VM ordnungsgemäß im Debug-Modus zu starten, benötigen wir 4 Parameter:
Parameter | Bedeutung/Funktion/Zweck
-Xdebug | Startet in Debugging-Modus
-Xnoagent | Deaktiviert den Support fürm Old Jave Debugger (oldjdb)
-Djava.compiler=NONE | "-D" setzt verschiedene Parameter. java.compiler=NONE bedeutet, dass der JIT-Compiler deaktiviert wird.
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6754 | "-Xrunjdwp" setzt die eigendlichen Debugging-Parameter. transport liegt die Verbindungsart fest. server sagt, dass er als Server auf Verbindungen warten soll. suspend sagt, dass er mit der Ausführung warten soll, bis ein Debugger verbindet. (In diesen Fall soll er NICHT warten.) address legt den Port fest, auf dem auf eine Verbindung gewartet werden soll.
Wenn unsere jar also rdbdemo.jar heißt, sieht der Befehl in der Kommandozeile so aus:
Um das Debugging zu testen, können wir uns ein kurzes Demoprogramm schreiben:
Nun müssen wir als Erstes die Debug-Konfiguration in Eclipse öffnen:
Hier Doppelklick auf "Remote Java Application":
Daraufhin legt Eclipse automatisch eine Konfiguration für das momentan ausgewählte Projekt an. Hier müssen nur noch wenige Einstellungen getroffen werden. Wir müssen lediglich den Hostname/IP des Hosts, auf dem die Anwendung im Debug-Modus läuft und den Port anpassen.
Nun können wir unsere eingerichtete Konfiguration starten:
Damit lässt sich die Anwendung remote genauso wie lokal debuggen. Inkl. Threads pausieren, Breakpoints, Variablenzugriff, zeilenweises abarbeiten und was es sonst noch so alles gibt.
Weiterführende Links:
Manchmal funktioniert ein Programm auf einem Rechner und auf einem anderen wiederrum nicht. So wie bei mir neulich: XP macht bspw. keinen Unterschied bei der Groß-/Kleinschreibung von Dateinamen, Ubuntu schon.
Durch einen Denkfehler lief lokal auf XP alles einwandfrei, auf dem Server wurde eine Exception beim Dateizugriff geworfen. Natürlich kann man dabei möglichst viel in die Standardausgabe schreiben und so den Fehler lokalisieren, aber in so gut wie jedem Fall ist es einfacher und sinnvoller einen Debugger zu verwenden.
Um die VM ordnungsgemäß im Debug-Modus zu starten, benötigen wir 4 Parameter:
-Xdebug | Startet in Debugging-Modus
-Xnoagent | Deaktiviert den Support fürm Old Jave Debugger (oldjdb)
-Djava.compiler=NONE | "-D" setzt verschiedene Parameter. java.compiler=NONE bedeutet, dass der JIT-Compiler deaktiviert wird.
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6754 | "-Xrunjdwp" setzt die eigendlichen Debugging-Parameter. transport liegt die Verbindungsart fest. server sagt, dass er als Server auf Verbindungen warten soll. suspend sagt, dass er mit der Ausführung warten soll, bis ein Debugger verbindet. (In diesen Fall soll er NICHT warten.) address legt den Port fest, auf dem auf eine Verbindung gewartet werden soll.
Wenn unsere jar also rdbdemo.jar heißt, sieht der Befehl in der Kommandozeile so aus:
Code:
java -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6754 -jar rdbdemo.jar
Um das Debugging zu testen, können wir uns ein kurzes Demoprogramm schreiben:
Java:
package rdbdemo;
import java.util.concurrent.TimeUnit;
public final class RDBDemo extends Thread
{
public RDBDemo()
{
super("Remote debugging demo thread");
}
public void run()
{
boolean die = false;
int i = 0;
do
{
i++;
try
{
TimeUnit.MILLISECONDS.sleep(200L);
}
catch (InterruptedException e) {}
}
while(!die);
}
public static void main(String[] args)
{
new RDBDemo().start();
}
}
Nun müssen wir als Erstes die Debug-Konfiguration in Eclipse öffnen:
Hier Doppelklick auf "Remote Java Application":
Daraufhin legt Eclipse automatisch eine Konfiguration für das momentan ausgewählte Projekt an. Hier müssen nur noch wenige Einstellungen getroffen werden. Wir müssen lediglich den Hostname/IP des Hosts, auf dem die Anwendung im Debug-Modus läuft und den Port anpassen.
Nun können wir unsere eingerichtete Konfiguration starten:
Damit lässt sich die Anwendung remote genauso wie lokal debuggen. Inkl. Threads pausieren, Breakpoints, Variablenzugriff, zeilenweises abarbeiten und was es sonst noch so alles gibt.
Weiterführende Links:
- java - the Java application launcher - Informationen über die verschiedenen VM Arguments.