B.8 | jdb |
Der jdb ist ein Kommandozeilen-orientierter Debugger. Er besitzt die Möglichkeit, sich in ein bereits gestartetes Java-Programm einzuhängen sowie Remote-Debugging durchzuführen. Im Kontext von jdb wird unter dem Begriff Frame ein Stack-Frame verstanden, das heißt die bei einem Methodenaufruf auf dem Stack abgelegten Informationen wie Parameterwerte und lokale Variablen. Zur Benutzung des Debuggers muss der Java-Interpreter der zu untersuchenden Anwendung mit der Option -debug gestartet werden.
Beim Start von jdb können folgende Optionen angegeben werden:Das zu testende Programm kann entweder direkt in jdb gestratet werden (mit jdb MyApp) oder zunächst so gestartet werden, dass sich jdb nachträglich in das laufende Programm einklinken kann. Hierzu muss zunächst der Interpreter des zu testenden Programms mit folgenden Optionen gestartet werden:
- -attach <address>
Klinkt sich in eine bereits laufende Virtual Machine am Port <address> ein. Diese Portnummer wird beim Start des zu untersuchenden Programms mit der Option -Xrunjdwp definiert.- -connect <connector>:<name>=<value>...
Verbindet sich mit <connector> zu einer Virtual Machine unter Verwendung der übergebenen Parameter.- -dbgtrace
gibt Informationen aus, um jdb selbst zu debuggen.- -classpath <classpath>
Gibt das Verzeichnis an, in dem jdb nach Klassen sucht. Diese Option setzt die CLASSPATH-Umgebungsvariable außer Kraft. Mehrere Pfade müssen durch ; (Windows) bzw. : (UNIX) getrennt werden.- -D<name>=<value>
reicht die angegebene Property an den Java-Interpreter weiter, in dem das getestete Programm ausgeführt wird. <name> muss durch den Namen der Property ersetzt werden, <value> durch den Wert.- -help
listet die vorhandenden Optionen auf.- -launch
Startet das untersuchte Programm sofort.- -listen <address>
Wartet an der Portnummer <address> auf eine Verbindung von einer Virtual Machine. Diese Portnummer wird beim Start des zu testenden Programms mit der Option -Xrunjdwp definiert.- -sourcepath <pathlist>
gibt die Pfade an, in denen jdb nach Quelltexten sucht. Mehrere Pfade müssen durch ; (Windows) bzw. : (UNIX) getrennt werden.- -tclient
Startet das untersuchte Programm in der HotSpot-Client Virtual Machine.- -tserver
Startet das untersuchte Programm in der HotSpot-Server Virtual Machine.- -version
gibt die Version von jdb aus.- -X<option>
reicht eine Nicht-Standard-Option an den Interpreter des Programms durch. Welche Optionen verfügbar sind, wurde bereits bei der Beschreibung von java angegeben.>java -debug -Xrunjdwp:transport=dt_socket,server=y,\ suspend=n,address=1234 <MyApp>Damit wird das Debugger-Backend als Server am Port 1234 gestartet. Lässt man address weg, wird ein zufälliger Port gewählt und angezeigt. Auf diesen Port kann sich nachfolgend jdb verbinden:jdb -attach 1234Ist jdb einmal gestartet, stehen folgende Kommandos zur Verfügung:Um lokale Variablen zu überwachen, muss das Programm mit der Option -g kompiliert worden sein.
- !!
führt das zuletzt eingegebene Kommando nochmals aus.- classes
gibt die Namen aller geladenen Klassen aus.- class <name>
Zeigt Informationen über die Klasse <name> an.- down [<frames>]
setzt den aktuell betrachteten Stack-Frame um <frames> Frames nach unten. Gibt man frames nicht an, wird um einen Frame verschoben.- eval <expr>
Wertet den Ausdruck <expr> aus und zeigt das Ergebnis an. <expr> muss ein gültiger Java-Ausdruck sein. Dieses Kommando hat dieselbe Funktion wie print.- fields <name>
Zeigt die in der Klasse <name> definierten Datenelemente an.- interrupt <thread>
Unterbricht den Thread <thread>.- locals
gibt die lokalen Variablen für den aktuellen Stack-Bereich aus.- methods <name>
Zeigt die in der Klasse <name> definierten Methoden an.- kill <thread> <expr>
Beendet den Thread <thread> mit der Exception <expr>.- print <expr>
Wertet den Ausdruck <expr> aus und zeigt das Ergebnis an. <expr> muss ein gültiger Java-Ausdruck sein.- run [<class>] [<arg1> ... <argN>]
startet die Ausführung der mit <class> angegebenen Klasse. Mit <arg1> bis <argN> können Argumente übergeben werden. Führt man run ohne Argument aus, werden die Argumente verwendet, die beim Starten des jdb angegeben wurden.- set <lvalue> = <expr>
Weist dem Ausdruck <lvalue> den Wert <expr> zu. Dieser Ausdruck kann ein Datenelement, eine Variable oder ein Array-Element sein. Dieses Kommando kann nur nach einem Breakpoint verwendet werden. Beispiel:main[1] set MyClass.myField=111;- threads [<threadgroup1> ... <threadgroupN>]
zeigt die Klassen und IDs aller Threads der angegebenen ThreadGroups an. Wird keine ThreadGroup angegeben, werden die Threads der aktuellen ThreadGroup angezeigt.- thread <thread>
Nach Aufruf dieses Kommandos ist der Thread mit der ID <thread> der aktuelle Thread.- resume [<thread1> ... <threadN>]
führt die Ausführung der angegebenen Threads fort. Wird kein Thread angegeben, werden alle Threads, die mit suspend angehalten wurden, wieder fortgeführt.- suspend [<thread1> ... <threadN>]
unterbricht die Ausführung der angegebenen Threads. Gibt man kein Argument an, wird die Ausführung aller gerade aktiven Threads unterbrochen. Mit dem Befehl resume kann ein unterbrochener Thread wieder gestartet werden.- threadgroup <threadgroup>
Nach Aufruf dieses Kommandos ist <threadgroup> die aktuelle ThreadGroup.- threadgroups
zeigt alle ThreadGroups an, die gerade aktiv sind.- up [<frames>]
setzt den aktuell betrachteten Stack-Frame um <frames> Frames nach oben. Gibt man <frames> nicht an, wird um einen Frame verschoben.- where [<thread>]
zeigt den Aufruf-Stack des übergebenen Threads an. Wird thread nicht angegeben, wird der Stack des aktuellen Threads angezeigt.- wherei [<thread>]
wie where, wobei zusätzlich der Wert des Program Counters angezeigt wird.- stop [in <class>.<method>]
setzt einen Breakpoint am Beginn der Methode <method> der durch <class> angegebenen Klasse. Gibt man keinen Parameter an, werden alle gerade gesetzten Breakpoints ausgegeben. <method> kann optional eine in runde Klammern eingefasste und durch Kommas getrennte Liste von Parametertypen folgen, um eine bestimte Variante einer Methode zu bezeichnen.- stop [at <class>:<line>]
setzt einen Breakpoint in der Zeile <line> in der durch <class> angegebenen Klasse. Gibt man keinen Parameter an, werden alle gerade gesetzten Breakpoints ausgegeben.- clear [<class>:<method>]
enfernt einen Breakpoint in Methode <method> der Klasse <class>. Gibt man <class> und <method> nicht an, wird eine Liste von allen Breakpoints ausgegeben. <method> kann optional eine Liste von Parametertypen folgen, um einen Breakpoint in einer bestimmten Variante der Methode zu löschen.- catch [<exception>]
fügt einen Breakpoint ein, der beim Auftreten der übergebenen Exception wirksam wird. Wird catch keine Exception übergeben, so wird eine Liste der Exceptions ausgegeben, die abgefangen werden.- ignore <exception>
ignoriert die durch den Klassennamen exception bezeichnete Exception.- watch [access¦all] <class>.<field>
unterbricht die Ausführung des Programms, wenn das Datenelement <class>.<field> geändert oder ausgelesen wird. Standardmäßig erfolgt eine Unterbrechung nur bei schreibenden Zugriffen. Mit access wird nur bei lesenden Zugriffen unterbrochen, mit all wird bei allen Zugriffen unterbrochen.- unwatch [access¦all] <class>.<field>
schaltet die Überwachung des spezifizerten Felds ab. Wird weder access noch all spezifiziert, werden nur die Unterbrechungen für schreibende Zugriffe deaktiviert.- trace methods [<thread>]
unterbricht die Ausführung des Programms, wenn eine Methode aufgerufen oder beendet wird. Optional kann die numerische ID eines Threads angegeben werden, bei dem die Methodenaufrufe verfolgt werden. Fehlt die Angabe, werden alle Threads überwacht. Die Thread-ID kann mit dem Kommando threads ermittelt werden.- untrace methods [<thread>]
schaltet die Überwachung der Methodenaufrufe ab. Optional kann die numerische ID eines Threads angegeben werden, bei dem die Überwachung abgeschaltet werden soll. Fehlt die Angabe, wird die Überwachung komplett deaktiviert.- step [up]
führt die aktuelle Zeile des aktuellen Threads aus. Mit der Option up wird die aktuelle Methode bis zum Ende ausgeführt.- stepi
führt die nächste Bytecode-Instruktion der aktuelle Zeile des aktuellen Threads aus.- next
führt die aktuelle Zeile des aktuellen Threads aus, wobei Methodenaufrufe nicht verfolgt, sondern übersprungen werden.- cont
führt die Ausführung eines Threads nach einer Unterbrechung durch einen Breakpoint fort.- list [<linenumber>¦<method>]
zeigt den Quellcode um die angegeben Zeilennummer des aktuellen Threads an. Zuvor muss der Pfad zum Quellcode mit use angegeben werden. Eine weitere Voraussetzung für dieses Kommando ist, dass zuvor ein Thread mit dem Kommando thread selektiert und mit suspend suspendiert wurde.- use [<path>]
sourcepath [<path>]
setzt das Verzeichnis, in dem Quelltext für das list-Kommando gesucht werden, auf <path>. Ohne Pfadangabe wird das derzeit verwendete Verzeichnis angezeigt.- classpath
zeigt den CLASSPATH an, den die Virtual Machine verwendet.- monitor [<command>]
bewirkt, dass das JDB-Kommando <command> bei jeder Unterbrechung des Programms ausgeführt wird. Sollen mehrere Kommandos ausgeführt werden, ist dieser Befehl mehrfach abzusetzen. Ohne die Angabe eines Kommandos werden die derzeit eingestellten Befehle angezeigt.- unmonitor <nr>
deaktiviert das Monitor-Kommando mit der Nummer <nr>. Diese Nummer kann mit dem monitor-Kommando angezeigt werden.- read <file>
liest die durch <file> bezeichnete Datei ein und führt die darin enthaltenen JDB-Kommandos aus. Jedes Kommando muss in einer eigenen Zeile stehen.- lock <expr>
gibt Informationen über den Sperr-Status eines Objekts aus.- threadlocks <id>
zeigt die Sperren an, die der durch <id> bezeichnete Thread besitzt. Dieser muss zuvor suspendiert werden.- pop
springt zu der Stelle zurück, an der die momentan ausgeführte Methode aufgerufen wurde.- reenter
springt zu der Stelle zurück, an der die momentan ausgeführte Methode aufgerufen wurde und ruft die Methode erneut auf.- redefine <class> <class file>
Lädt den Bytecode der Klasse <class> neu.- disablegc <expr>
unterbindet die Garbage Collection für das durch <expr> bezeichnete Objekt.- enablegc <expr>
erlaubt die Garbage Collection für das durch <expr> bezeichnete Objekt.- help
?
zeigt alle verfügbaren Kommandos an.- version
zeigt Versionsinformationen an.- exit
quit
beendet jdb.- !!
wiederholt das letzte Kommando.- <n> <command>
führt das Kommando <command> <n>-mal aus.
Ein Objekt, das einem Kommando als Parameter übergeben wird, kann entweder durch seinen Namen oder seine ID angegeben werden. Die ID ist eine hexadezimale Zahl, mit der ein Objekt innerhalb des jdb identifiziert wird. Die ID einer Klasse wird z. B. ausgegeben, wenn sie in den jdb geladen wird. Die ID von Klassen kann außerdem mit dem Kommando classes erfragt werden.