Login
Newsletter
Werbung

Mo, 7. August 2000, 00:00

GNU Debugger (gdb)

Der GNU Debugger (gdb) ist ein sehr mächtiger, kommandozeilen-orientierter Debugger. In diesem Artikel sollen die am häufigsten benötigten Funktionen des gdb vorgestellt werden.

Ein Debugger ist ein Werkzeug, das zur Fehlersuche verwendet wird. Man kann damit ein Programm kontrolliert ausführen, also das Programm Zeile für Zeile ausführen und die Werte von Variablen abfragen und ändern. Dadurch ist es leichter, einem Fehler auf die Spur zu kommen.

Aber ein Debugger kann natürlich noch viel mehr. Man kann sogenannte "Breakpoints" setzen, an denen das Programm vorübergehend angehalten wird. Außerdem kann man einen bereits laufenden Prozess in den Debugger laden oder wenn ein Programm abgestützt ist, im Nachhinein schauen, was die Ursache war.

Ein Programm muss Debugging-Informationen enthalten, damit man es im Debugger kontrollieren kann. Dazu übergibt man gcc die Option -g.

Es gibt drei Möglichkeiten, eine Debugging-Session mit gdb zu starten. Die einfachste Variante ist, als Argument einfach den Namen der ausführbaren Datei anzugeben. Wenn mein Programm sv heißt, gebe ich z.B. ein:

gdb sv

Wenn ein Prozess durch einen Speicherzugriffsfehler (Segmentation fault) abgestürzt ist und ein sog. "Coredump" erstellt wurde, kann man sowohl den Namen des Programmes als auch den Namen des Coredumps (meistens einfach core) angeben, um zu schauen, wo das Problem auftrat:

gdb sv core

Wenn man ein Programm geschrieben hat, das beispielsweise die Bibliothek ncurses verwendet, ist es nützlich, einen Prozess auf einem Terminal laufen zu lassen und den Debugger auf einem anderen. Das ist möglich, indem man dem Programm eine Option --sleep verpasst, dass es anhält:

int
main (int argc, char *argv[])
{
 if (argc == 2
 && !strcmp(argv[1], "--sleep"))
 sleep (6000);
 ...
}

Nun ruft man das Programm auf einem Terminal mit dieser Option auf und schaut auf dem anderen mit ps x nach der Prozessnummer. Ist diese beispielsweise 654, so verbindet man gdb mit dem Prozess durch

gdb sv 654

Nun kann man mit dem GDB-Kommando

set args [argumente]

die Kommandozeilenargumente des Prozesses noch setzen.

Meist möchte man den Prozess nicht von Anfang an zeilenweise beobachten. Daher wird man oft als erstes einen Breakpoint setzen. Um die Funktion foo() als Breakpoint zu verwenden, gibt man im gdb ein:

break foo

Man kann aber auch Zeilennummern oder Dateinamen mit Zeilennummer angeben:

break 513
break qux.x:77

Es können beliebig viele Breakpoints gesetzt werden. Löschen kann man einen Breakpoint mit

clear foo

Nun kann man den Prozess starten lassen durch

run

Wenn der Prozess bereits gestartet wurde und man ihn weiterlaufen lassen will, verwendet man

c

(für "continue"). Sobald nun ein Breakpoint erreicht wird, wird der Prozess angehalten und man gelangt auf den gdb-Prompt. Nun kann man sich den Stack anzeigen lassen (also schauen, wie wir zu dieser Stelle gelangt sind), indem man das Backtrace-Kommando eingibt:

bt

Außerdem kann man sich Ausdrücke auswerten lassen. So könnte man sich den Wert der Variablen bar anzeigen lassen, indem man

p bar

eingibt. Da hier beliebige Ausdrücke verwendet werden können (nur Funktions-Aufrufe sind nicht erlaubt), kann man auch neue Werte zuweisen:

p bar=1

Den Quellcode, der die aktuelle Zeile umgibt, wird mit

l

(für "list") ausgegeben. Hier kann auch eine Zeilennummer übergeben werden oder ein Dateiname mit Zeilennummer:

l 215
l baz.c:334

Um das Programm schrittweise ausführen zu lassen, gibt es zwei Möglichkeiten: next und step. Mit

next

oder der kurzen Variante n lässt man die nächste Zeile ausführen. Anschließend wird die darauffolgende Zeile angezeigt. Wenn man im gdb kein Kommando eingibt, sondern einfach Return drückt, wird das letzte Kommando wiederholt. Das ist natürlich vor allem bei n sehr praktisch.

Will man aber in eine Funktion "hineinspringen" und den Programmablauf darin verfolgen, verwendet man

step

oder die Kurzschreibweise s. Diese wenigen Befehle sind für die meisten Zwecke schon ausreichend. Weitere Befehle können Sie lernen, wenn sie im gdb

help

eingeben.

Natürlich gibt es zu gdb auch Frontends für X11, beispielsweise xxgdb und (sehr zu empfehlen) ddd, aber es soll ja auch Leute geben, die gerne auf der Konsole arbeiten :-)

Kommentare (Insgesamt: 0 )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung