1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
|
<html>
<head>
<title>
Handbuch der Java-Programmierung, 5. Auflage
</title>
</head>
<body>
<a name="startofbody"></a>
<script language="JavaScript" src="hjp4lib.js">
</script>
<script language="JavaScript">
installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100317.html;106,k100320.html;107,k100322.html;108,index.html");
</script>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100317.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100320.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100322.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">Kapitel 51 - Hilfsprogramme des JDK
</table>
<hr>
<!-- Section -->
<a name="sectlevel2id051004"></a>
<h2>51.4 jdb - Der <a name="ixa103746">Debugger</a> </h2>
<hr>
<ul>
<li><a href="k100321.html#sectlevel2id051004">51.4 jdb - Der Debugger</a>
<ul>
<li><a href="k100321.html#sectlevel3id051004001">51.4.1 Aufruf</a>
<li><a href="k100321.html#sectlevel3id051004002">51.4.2 Beschreibung</a>
<li><a href="k100321.html#sectlevel3id051004003">51.4.3 Vorbereitungen</a>
</ul>
</ul>
<hr>
<!-- Section -->
<a name="sectlevel3id051004001"></a>
<h3>51.4.1 Aufruf </h3>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
jdb [ classfile ]
</pre>
</font>
</td>
</tr>
</table>
<!-- Section -->
<a name="sectlevel3id051004002"></a>
<h3>51.4.2 Beschreibung </h3>
<p>
<a name="ixa103747"><a href="index_j.html#ixb102764"><font color=#000080><tt>jdb</tt></font></a></a>
ist der Debugger des JDK. Er bietet die Möglichkeit, Programme
kontrolliert ablaufen zu lassen und dabei Breakpoints zu setzen, im
Einzelschrittmodus den nächsten Befehl ausführen zu lassen
oder den Inhalt von Variablen oder Objekten zu inspizieren. Man sollte
allerdings nicht zu große Erwartungen an <a href="index_j.html#ixb102764"><font color=#000080><tt>jdb</tt></font></a>
stellen, denn das Programm ist ein Kommandozeilendebugger in schönster
UNIX-Tradition. Mit den grafischen Debuggern der integrierten Java-Entwicklungsumgebungen
hat er nur wenig gemeinsam. Leider ist er nicht nur umständlicher
zu bedienen, sondern läßt (insbesondere in Prä-1.2-JDKs)
auch einige wichtige Features moderner Debugger vermissen.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Seit der Version 1.3 besitzt das JDK eine neue Debugging-Architektur.
Sie wird als <a name="ixa103748"><i>JPDA</i></a> (<a name="ixa103749"><i>Java Platform Debugger
Architecture</i></a>) bezeichnet und erlaubt
es, Debugger komplett in Java zu schreiben. Zwar wird nach wie vor
kein ausgefeilter GUI-Debugger mit dem JDK ausgeliefert. Doch befindet
sich im Unterverzeichnis <font color="#660099">jpda</font> des Demo-Verzeichnisses
des JDK ein Beispielprogramm <a name="ixa103750"><a href="index_j.html#ixb102794"><font color=#000080><tt>javadt</tt></font></a></a>,
dass als Prototyp eines GUI-Debuggers angesehen werden kann. Hinweise
zu seiner Verwendung finden sich in der JDK-Dokumentation. Auch integrierte
Entwicklungsumgebungen verwenden diese Schnittstelle, um ihre eigenen
Debugger einzubinden.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#FF9900">
<tr>
<td><font color="#FFFFFF"> JDK1.1-6.0 </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
</tr>
</table>
<!-- Section -->
<a name="sectlevel3id051004003"></a>
<h3>51.4.3 Vorbereitungen </h3>
<p>
Damit ein Programm debugt werden kann, sollte es mit der Option <a name="ixa103751"><a href="index_0.html#ixb102767"><font color=#000080><tt>-g</tt></font></a></a>
übersetzt werden. Dadurch werden symbolische Informationen in
die Klassendatei geschrieben, die der Debugger zur Interpretation
von lokalen Variablen benötigt. Beim Aufruf des Debuggers kann
die zu untersuchende Klassendatei als Argument angegeben werden:
<font color="#000077">
<pre>
jdb classfile
</pre>
</font>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Damit <a href="index_j.html#ixb102764"><font color=#000080><tt>jdb</tt></font></a>
überhaupt startet, muss ein laufender TCP/IP-Stack vorhanden
sein. Dies ist für Anwender unangenehm, die nur eine Wählverbindung
zu ihrem Provider haben, denn bei jedem Starten des Debuggers die
Verbindung aufzubauen ist nicht nur umständlich, sondern auch
kostspielig. Die übliche Empfehlung im Usenet lautet in diesem
Fall, eine Datei <a name="ixa103752"><a href="index_h.html#ixb102795"><font color=#000080><tt>hosts</tt></font></a></a>
anzulegen und den folgenden Eintrag einzufügen:</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF"> Hinweis </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>
<font color="#000077">
<pre>
127.0.0.1 localhost
</pre>
</font>
<p>
Unter Windows 95 muss die Datei im Windows-Installationsverzeichnis
(typischerweise <font color="#660099">c:\windows</font>) angelegt
werden, meist gibt es dort schon eine Kopiervorlage <font color="#660099">hosts.sam</font>,
die verwendet werden kann. In aktuellen JDKs kann auf das Anlegen
der Datei unter Umständen verzichtet werden. Falls der Debugger
nicht starten will, kann es sinnvoll sein, zusätzlich die <a name="ixa103753"><i>DNS-Konfiguration</i></a>
zu deaktivieren. Dazu ist in der Systemsteuerung im Bereich »Netzwerk«
das TCP/IP-Protokoll auszuwählen und nach Klick auf »Eigenschaften«
im Registerblatt »DNS-Konfiguration« der Button »DNS
deaktivieren« anzuklicken.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Bei dieser Anpassung ist allerdings Vorsicht geboten, denn Veränderungen
an den Netzwerkeinstellungen können die Netzwerkanbindung des
Rechners unbrauchbar machen. Es empfiehlt sich in jedem Fall, vor
der Veränderung der Parameter die alte Konfiguration zu notieren,
um sie nötigenfalls wieder restaurieren zu können. Veränderungen
sollte sowieso nur derjenige vornehmen, der genau weiß, was
er tut.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
<tr>
<td><font color="#FFFFFF"> Warnung </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
</tr>
</table>
<p>
Nachdem der Debugger gestartet wurde, meldet er sich mit seiner Kommandozeile
und ist bereit, Befehle entgegenzunehmen. Die wichtigsten von ihnen
werden in <a href="k100321.html#jdbkommandos">Tabelle 51.4</a> vorgestellt
und kurz erläutert. <a name="jdbkommandos"></a>
<p>
<table cols=2 border width=100%>
<tr>
<td valign=top align=left width=20%><b>Kommando</b></td>
<td valign=top align=left width=80%><b>Bedeutung </b></td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>?</tt></font></td>
<td valign=top align=left>Liefert eine Übersicht aller Kommandos.
Alternativ kann auch das Kommando <font color="#000077"><tt>help</tt></font>
verwendet werden. </td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>!!</tt></font></td>
<td valign=top align=left>Wiederholt das letzte Kommando. </td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>load classname</tt></font></td>
<td valign=top align=left>Lädt eine Klassendatei in den Debugger.
Falls <a href="index_j.html#ixb102764"><font color=#000080><tt>jdb</tt></font></a>
bereits mit einer Klassendatei als Argument aufgerufen wurde, muss
dieses Kommando nicht mehr aufgerufen werden. </td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>run</tt></font></td>
<td valign=top align=left>Startet das geladene Programm. Falls die
Klassendatei mit <font color="#000077"><tt>load</tt></font> geladen
wurde, müssen zusätzlich der Klassenname und ggfs. weitere
Parameter des Programms übergeben werden. Nach Ausführung
dieses Programms läuft das Programm bis zum nächsten Breakpoint
oder bis es mit dem <font color="#000077"><tt>suspend</tt></font>-Kommando
angehalten wird. </td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>quit</tt></font></td>
<td valign=top align=left>Beendet den Debugger. Alternativ kann auch
das Kommando <font color="#000077"><tt>exit</tt></font> verwendet
werden. </td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>stop in</tt></font></td>
<td valign=top align=left>Setzt einen Breakpoint auf den Anfang einer
Methode. Das Kommando erwartet den Namen der Klasse, einen Punkt und
den Namen der Methode als Argument. Beispiel:
<br>
<font color="#000077"><tt>stop in JDBBeispiel.actionPerformed</tt></font>
</td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>stop at</tt></font></td>
<td valign=top align=left>Setzt einen Breakpoint auf eine vorgegebene
Zeile. Dazu müssen der Name der Klasse, ein Doppelpunkt und die
Zeilennummer innerhalb der Quelldatei angegeben werden. Beispiel:
<br>
<font color="#000077"><tt>stop at JDBBeispiel:48</tt></font> </td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>clear</tt></font></td>
<td valign=top align=left>Löscht einen Breakpoint. Als Argument
müssen der Klassenname, gefolgt von einem Doppelpunkt und der
Zeilennummer, in der sich der Breakpoint befindet, angegeben werden.
Es gibt keine Möglichkeit, eine Liste der aktuellen Breakpoints
anzeigen zu lassen. </td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>list</tt></font></td>
<td valign=top align=left>Zeigt den aktuellen Ausschnitt des Quelltextes
an, an dem das Programm angehalten wurde. Die als nächstes auszuführende
Zeile wird durch einen Pfeil markiert. Alternativ kann auch der Name
einer Methode oder eine Zeilennummer an das Kommando übergeben
werden. </td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>step</tt></font></td>
<td valign=top align=left>Nachdem ein Programm angehalten wurde, kann
es mit diesem Kommando im Einzelschrittmodus fortgeführt werden.
Befindet sich an der Aufrufstelle ein Methodenaufruf, springt das
Kommando in die Methode hinein und bleibt bei der ersten ausführbaren
Anweisung stehen. </td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>next</tt></font></td>
<td valign=top align=left>Wie <font color="#000077"><tt>step</tt></font>,
springt dabei aber nicht in einen Methodenaufruf hinein, sondern führt
die Methode als Ganzes aus und bleibt beim nächsten Kommando
nach dem Methodenaufruf stehen. Dieses Kommando steht erst ab dem
JDK 1.2 zur Verfügung. </td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>step up</tt></font></td>
<td valign=top align=left>Führt die aktuelle Methode bis zum
Ende aus. </td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>cont</tt></font></td>
<td valign=top align=left>Führt das Programm nach einem Breakpoint
fort. Es läuft dann bis zum nächsten Breakpoint oder bis
es mit dem <font color="#000077"><tt>suspend</tt></font>-Kommando
angehalten wird. </td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>print</tt></font></td>
<td valign=top align=left>Zeigt den Inhalt der Variablen an, die als
Argument übergeben wurde. <font color="#000077"><tt>print</tt></font>
verwendet dazu die Methode <a href="index_t.html#ixb100327"><font color=#000080><tt>toString</tt></font></a>,
die in allen Objektvariablen implementiert ist. Damit eine Variable
angezeigt werden kann, muss sie an der Aufrufstelle sichtbar sein.
Es gibt leider keine Möglichkeit, den Inhalt einer Variablen
aus dem Debugger heraus zu verändern. </td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>dump</tt></font></td>
<td valign=top align=left>Zeigt den Inhalt der Objektvariable, die
als Argument übergeben wurde, inklusive aller Membervariablen
an. Damit eine Variable angezeigt werden kann, muss sie an der Aufrufstelle
sichtbar sein. </td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>locals</tt></font></td>
<td valign=top align=left>Gibt eine Liste aller lokalen Variablen
und ihrer aktuellen Inhalte aus. </td></tr>
<tr>
<td valign=top align=left><font color="#000077"><tt>where</tt></font></td>
<td valign=top align=left>Zeigt einen Stacktrace an.</td></tr>
</table>
<p><i>
Tabelle 51.4: Kommandos von jdb </i></p>
<hr>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
Wesley, Version 5.0.1
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100317.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100320.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100322.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">© 1998, 2007 Guido Krüger & Thomas
Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
</table>
<a name="endofbody"></a>
</body>
</html>
|