Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
GDB
GDB (GNU Debugger) ist ein weit verbreiteter Debugger für diverse Sprachen wie C, C++ und Java. GDB ist ein Kommandozeilen-Programm und lässt sich somit relativ einfach bedienen.
Wichtige Kommandos
Kommando | Beschreibung |
---|---|
file | Programm angeben zum debuggen |
watch | Variable beobachten |
break | Breakpunkt setzen |
run | Programm starten |
continue | Programm fortfahren |
step | nächsten Schritt ausführen (auch in Subroutinen) |
next | nächsten Schtitt ausführen (Subroutinen überspringen) |
print | Variableninhalt dezimal ausgeben |
print/x | Variableninhalt hexadezimal ausgeben |
finish | Programm laufen lassen bis Funktion beendet ist |
delete | Breakpunkt löschen |
info breakpoints | Informationen zu den gesetzten Breakpoints |
Beispiel
Programmcode
Compiler-Option
Um das obige main.c
zu kompilieren könnte man gcc -o main.o main.c
verwenden. Um aber das Debugging zu ermöglichen muss die Option -g
hinzugefügt werden.
gcc -g -o debug.o main.c
GDB starten
Um das kompilierte Programm (debug.o
) zu debuggen, kann einfach GDB gestartet werden in der Kommandozeile.
[user@machine ]$ gdb
Datei laden
Ist GDB gestartet kann die datei debug.o
angegeben werden zum debuggen.
(gdb) file debug.o Reading symbols from debug.o...done.
Sollte eine Fehlermeldung auftreten wie die folgende
(gdb) file main.o Reading symbols from main.o...(no debugging symbols found)...done.
sollte überprüft werden, ob die Compiler-Option -d
gesetzt wurde beim kompilieren.
Breakpoint setzen
Um einen Breakpunkt zu setzten muss lediglich der Name der Quelldatei und die Zeilennummer angegeben werden. Das folgede Beispiel setzt einen Breakpunkt im main.c
auf Zeile 7 und 12.
(gdb) break main.c:7 Breakpoint 1 at 0x400515: file main.c, line 5. (gdb) break main.c:12 Breakpoint 2 at 0x400536: file main.c, line 12.
Programm starten
Möchte man das Programm starten so kann run
ausgeführt werden.
(gdb) run
Das Kommando run
startet das Programm, d.h. es sollte nicht nach einem Brekapoint verwendet werden.
Wendet man run
auf das obige Beispiel an mit den gesetzten Breakpoints im main.c
auf Zeile 7 und 12, so wird das Programm bei der Zeile 7 stehen bleiben.
(gdb) run Starting program: /home/ninux/data/studium/mc/gdb/ex1/debug.o Got object file from memory but can't read symbols: File truncated. warning: Could not load shared library symbols for linux-vdso.so.1. Do you need "set solib-search-path" or "set sysroot"? Breakpoint 1, main (argv=1, argc=0x7fffffffe9d8) at main.c:7 7 c = 0;
Weiterfahren nach Breakpoint
Is das Programm stehen geblieben bei einem Breakpoint so kann man es weiter laufen lassen mittels step
, next
oder continue
. continue
läuft dabei einfach weiter bis wieder ein Breakpoint oder ähnliches erreicht wird. next
und step
dienen zum schrittweisen durchlaufen des Programms. Im Unterschied zu next
geht step
auch durch sämtliche Subroutinen durch, next
dagegen behandelt Subroutinen wie einzelne Befehle.
(gdb) continue Continuing. Breakpoint 2, main (argv=1, argc=0x7fffffffe9d8) at main.c:12 12 c += b;
Variableninhalt anzeigen
Um bei einem Breakpoint Variableninhalte anzeigen zu lassen, kann das Kommando print
(dezimal) bzw. print/x
(hexadecimal) verwendet werden. Das folgende Beispiel zeigt die Ausgabe für die Variablen c
und a
zur Zeile 12 aus main.c
(gdb) print c $1 = 5 (gdb) print/x c $2 = 0x5 (gdb) print a $3 = 5 (gdb) print/x a $4 = 0x5
Info zu Breakpoints anzeigen
Um eine Übersicht der aktuellen Breakpoints zu bewahren gibt es das Kommando info breakpoints
welches alles Breakpoints auflistet.
(gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x0000000000400515 in main at main.c:7 2 breakpoint keep y 0x0000000000400530 in main at main.c:12
Literatur
- GDB - kurz & gut, O'Reilly, ISBN 3-89721-512-8, im LuXeria verfügbar
Weblinks
- type:
- topic
- beginner:
- ninux