Welche Kommunikation findet zwischen Eclipse und meinem Anwendungsserver (JBoss) statt, wenn ich den Server in Eclipse im Debugging-Modus ausführe? Wie funktioniert das?
Antworten
Zu viele Anzeigen?Wenn Sie den Server im Debug-Modus starten, lauscht er an einem bestimmten TCP-Port. Eclipse verbindet sich mit diesem Port, und die beiden kommunizieren über das Java Debug Wire Protocol (JDWP). Lesen Sie die Details hier: http://java.sun.com/j2se/1.5.0/docs/guide/jpda/
Das Debugging in Eclipse beginnt mit so genannten Agenten.
Die JVM, auf der die kompilierten .class-Quellen ausgeführt werden, verfügt über eine Funktion, die es ermöglicht, externe Bibliotheken (die entweder in Java oder C++ geschrieben sind) in die JVM zu injizieren, und zwar genau zur Laufzeit. Diese externen Bibliotheken werden als Agenten bezeichnet und haben die Fähigkeit, den Inhalt der ausgeführten .class-Dateien zu verändern. Diese Agenten haben Zugriff auf Funktionen der JVM, auf die ein normaler Java-Code, der in der JVM läuft, nicht zugreifen kann, und sie können für interessante Aufgaben wie das Einspeisen und Ändern des laufenden Quellcodes, Profiling usw. verwendet werden. Tools wie JRebel nutzen diese Funktionalität, um ihre Magie zu entfalten.
Um eine Agent-Lib an eine JVM zu übergeben, tun Sie dies über Startargumente, indem Sie die
agentlib:libname[=options] format.
Wir haben der JVM, auf der Tomcat läuft, eine Agent Lib namens jdwp übergeben. Bei jdwp handelt es sich um eine JVM-spezifische, optionale Implementierung des JDWP (Java Debug Wire Protocol), das zur Definition der Kommunikation zwischen einem Debugger und einer laufenden JVM verwendet wird. Seine Implementierung wird, falls vorhanden, als native Bibliothek der JVM entweder als jdwp.so oder jdwp.dll bereitgestellt.
Was macht es also? Einfach ausgedrückt, dient der jdwp-Agent, den wir übergeben, im Wesentlichen als Bindeglied zwischen der JVM-Instanz, auf der eine Anwendung läuft, und einem Debugger (der sich entweder an einem entfernten oder lokalen Standort befinden kann). Da es sich um eine Agentenbibliothek handelt, ist sie in der Lage, den laufenden Code abzufangen, eine Brücke zwischen der JVM und einem Debugger zu schlagen und die Funktionalität eines Debuggers auf die JVM anzuwenden. Da in der JVM-Architektur die Debugging-Funktionalität nicht in der JVM selbst zu finden ist, sondern in externe Tools abstrahiert wird (die treffend als Debugger bezeichnet werden), können diese Tools entweder auf dem lokalen Rechner, auf dem die zu debuggende JVM läuft, oder auf einem externen Rechner ausgeführt werden. Diese entkoppelte, modulare Architektur ermöglicht es uns, eine JVM auf einem entfernten Rechner laufen zu lassen und mit Hilfe des JDWP einen entfernten Debugger mit ihr kommunizieren zu lassen.
So funktioniert der Eclipse-Debugger in Kurzform.