Java Webstart (JWS) Remote debugging

Nach blöder Rumprobiererei habe ich endlich eine Remote Debugging connection hinbekommen. Hintergrund: Entwicklungsrechner mit Windows, Probleme unter Linux. Der Umstand, dass es sich um ein Webstart-App handelt, macht es noch ein bißchen kniffliger. Nach der Konsultation von einigen Foren und Blogs hab ich es jetzt geschafft: Auf dem Linuxrechner läuft die JVM im Debug-Modus und mit dem unter Windows installierten Eclipse kann ich (fast) debuggen, als wäre es eine aus Eclipse gestartete Anwendung. Voraussetzung ist natürlich, dass man den Sourcecode zur Verfügung hat. Reverse-Engineering mittels JODE funktioniert nur teilweise sauber. Ein weiterer -leider einschneidender- Nachteil ist der, dass die Variablenwerte nicht auslesbar sind. Es ist also sinnvoll, den Code mit entsprechend vielen Log-Statements zu instrumentieren, die über die Java-Konsole ausgelesen werden können.

Mein Vorgehen:

1. Die VM muss mit bestimmten Flags gestartet werden. Dazu bietet sich die Umgebungsvariable JAVAWS_VM_ARGS an. Funktioniert hat es mit folgenden Parametern:

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

Diese Konfiguration führt dazu, dass die VM auf Port 8888 hört. Firewalls sind ggf. auszuschalten bzw. zu konfigurieren. In einigen Foren habe ich gelesen, man müsse noch einen Servernamen angeben, wenn es sich nicht um localhost handelt. Das stimmt nicht.

2. Dann habe ich mir die bei einem vorherigen Start heruntergeladene JNLP-Datei geschnappt und lokal gestartet: javaws xxx.jnlp. Die Konsolenausgaben geben ein gewisses Feedback, ob alles geklappt hat. Unter Windows ging das bei mir übrigens nicht. Da meckert er, er könne die Main-Class nicht finden. Warum? Keine Ahnung… U.U. muss die JNLP-Datei noch ein bißchen überarbeitet werden.

3. Zum Test auf dem Linux-Rechner den Debugger starten: jdb -attach localhost:8888. Hier ist es wichtig, den Servernamen mitanzugeben, sogar wenn es sich um localhost handelt. Gelingt ein Connect ist alles in Butter. Gelingt er nicht: Viel Spass beim Wühlen im Netz.

4. Im Eclipse auf dem Windows-Rechner: Findet sich im, über “Debug…” geöffneten Menü im linken Teil ein Eintrag: “Remote Java Application”. Davon eine neue anlegen. Im Dialog den Port (8888) angeben und den Linux-Rechner eintragen (bei mir tat es nur die IP-Adresse). Projekt auswählen, Connection Type “Standard (Socket Attach)”. Alle anderen Einstellungen sind okay.

5. Bei gestarteter Linux-VM diese Konfiguration starten und fertig ist die Kiste. Es läßt sich debuggen wie gewohnt.