Java-Anwendung remote debuggen (mit Eclipse)

Aus Byte-Welt Wiki
Wechseln zu: Navigation, Suche

Einleitung

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.

Die Parameter

Um die VM ordnungsgemäß im Debug-Modus zu starten, benötigen wir 4 Parameter:

Parameter Bedeutung/Zweck/Funktion
Djava.compiler=NONE "-D" setzt verschiedene Parameter. java.compiler=NONE bedeutet, dass der JIT-Compiler deaktiviert wird.
-Xdebug Startet in Debugging-Modus
-Xnoagent Deaktiviert den Support fürm Old Jave Debugger (oldjdb)
-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.

Das Beispiel

Wenn unsere jar also rdbdemo.jar heißt, sieht der Befehl in der Kommandozeile so aus:

java -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6754 -jar rdbdemo.jar

Der Debugging-Test

Um das Debugging zu testen, können wir uns ein kurzes Demoprogramm schreiben:

    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();
        }
    }

Die Konfiguration

1. Nun müssen wir als Erstes die Debug-Konfiguration in Eclipse öffnen:

Debug1.png


2. Hier Doppelklick auf "Remote Java Application":

Debug2.png


3. 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.

Debug3.png


4. Nun können wir unsere eingerichtete Konfiguration starten:

Debug4.png


5. 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.

Debug5.png

--Volvagia (09.08.2011, 20:08 Uhr)