[[Vorlage(Getestet, focal)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:GCC: Ein Programm kompilieren] [:Terminal: Ein Terminal öffnen] }}} [[Inhaltsverzeichnis(2)]] [[Bild(gdb.png, 48, left)]] [http://www.gnu.org/software/gdb/ GDB] {en} (GNU-Debugger) hat sich zum Standard-Debugging-Werkzeug unter Unix/Linux gemausert und hilft dabei, Programmfehler ([wikipedia:Programmfehler:Bugs]) aufzufinden. Er unterstützt in C, C++, FORTRAN, Pascal, Modula-2, Ada und D geschriebene Programme. Um eine bestmögliche Unterstützung zu garantieren, sollten spezielle Debug-Informationen angehängt werden, in der [:GCC:] entspricht dies der Option ``-g`` [2]. Wollen installierte Programme nach Fehlern untersucht werden, sollte dafür ein spezielles Debugging-Paket installiert werden, welches in der Regel ''-dbg'' genannt wird, z. B. '''pidgin-dbg'''. = Installation = Sofern nicht bereits Bestandteil der Distribution, muss folgendes Paket installiert [1] werden: {{{#!vorlage Paketinstallation gdb, universe }}} = Grafische Oberflächen = Es existieren zwar einige direkte Frontends für GDB, aber prinzipiell unterscheiden sie sich nicht grundlegend von der Bedienung GDBs auf der Kommandozeile, weshalb nicht näher auf sie eingegangen wird. Andererseits beruht die Debug-Funktionalität der meisten [:Entwicklungsumgebungen:] auf GDB (beispielsweise besitzt [:Emacs:] einen „GUD mode“) so dass die Frontends hauptsächlich für den externen Einsatz gedacht sind. == ddd == [[Bild(./ddd_new.png, 150, align=right)]] Ein großer Funktionsumfang wird vom klassischen [http://www.gnu.org/software/ddd/ Data Display Debugger] {en} unterstützt. Er wirkt aufgrund des [:GUI-Toolkits:Toolkits] LessTif auf den meisten Desktopumgebungen etwas veraltet. Er kann durch das gleichnamige Paket nachinstalliert [1] werden: {{{#!vorlage Paketinstallation ddd, universe }}} == nemiver == [[Bild(./nemiver_new.png, 150, align=right)]] Eine moderne und sehr intuitive Oberfläche bietet nemiver, der das Ziel verfolgt, sich möglichst gut in [:GNOME:] zu integrieren. Weitere Infos finden sich auf der [http://projects.gnome.org/nemiver/ Projektseite] {en}. Er kann durch folgendes Paket installiert werden [1]: {{{#!vorlage Paketinstallation nemiver, universe }}} == CGDB == [[Bild(./cgdb_new.png, 150, align=right)]] Wer bei der Konsole bleiben will, aber trotzdem eine mächtigere Benutzerschnittstelle haben möchte, für den bietet sich der [https://cgdb.github.io/ CGDB] {en} an. Er basiert auf [wikipedia:ncurses:] und ist dadurch ein reines Terminalprogramm [3]. Folgendes Paket muss installiert werden [1]: {{{#!vorlage Paketinstallation cgdb, universe }}} = Direkte Interaktion = == Grundlegende Benutzung == Nachdem alle Quelldateien mit der Option ``-g`` kompiliert wurden [2] (eine grundlegende Funktionalität ist auch ohne Debug-Informationen verfügbar), muss GDB noch im Terminal gestartet werden [3]. Dies geschieht durch {{{#!vorlage Befehl gdb }}} Als nächstes kann die Programm-Datei geladen werden: {{{#!vorlage Befehl (gdb) file }}} Das Programm selbst muss noch einmal explizit gestartet werden. Dabei können auch Parameter übergeben werden: {{{#!vorlage Befehl (gdb) run arg1 arg2 ... Haltepunkte setzen +++ Befehl Beispiel Wirkung +++ ``break [:]`` ``break program.c:19`` Stoppt bei Erreichen der genannten Zeile. Wenn das Projekt nur aus einer Datei besteht, kann der Dateinamen weggelassen werden +++ ``break `` ``break foo`` Stoppt beim Aufruf der Funktion (nur C). +++ ``break ()`` ``break widget::foo(int, int)`` In C++ muss immer die volle Signatur angegeben werden, auch wenn eine Funktion nicht überladen ist. }}} Wenn ``tbreak`` anstelle von ``break`` verwendet wird, stoppt GDB nur einmal, danach wird der Haltepunkt wieder gelöscht. Wer die gesetzten Haltepunkte erfahren möchte, erhält über ``info breakpoints`` eine nummerierte Liste, mittels ``ignore `` können einzelne über ```` Durchläufe ignoriert werden, mittels ``disable`` entfernt man sie komplett. == Programmfluss beeinflussen == GDB zeigt zwar immer an, wo gestoppt wurde, meist braucht ein Mensch die umgebenden Codezeilen. Die 10 erhält man mit ``list``. Danach kann die Ausführung manuell gesteuert werden. {{{#!vorlage Tabelle <-3 rowclass="titel">Programmfluss beeinflussen +++ Befehl Beschreibung +++ ``continue`` Weiterlaufen lassen bis zum nächsten Unterbruch +++ ``next`` Nur eine einzelne Zeile ausführen, in der aktuellen Ebene bleiben +++ ``step`` Führt die nächste Linie aus, springt aber in aufgerufene Funktionen. +++ ``finish`` Beendet die Funktion und kehrt zum Aufrufer zurück. }}} == Nähere Auswertungen == Oft ist es sehr aufschlussreich, die Stapelung der Funktionsaufrufe zu erfahren. Dazu wird ``backtrace`` verwendet: {{{#!vorlage Befehl (gdb) backtrace #0 func2 (x=30) at test.c:5 #1 0x80483e6 in func1 (a=30) at test.c:10 #2 0x8048414 in main (argc=1, argv=0xbffffaf4) at test.c:19 #3 0x40037f5c in __libc_start_main () from /lib/libc.so.6 }}} Variablen können durch den ``print``-Befehl gezeigt und durch ``set`` verändert werden: {{{#!vorlage Befehl (gdb) print x $1 = 900 gdb set var x = 3 gdb print x $4 = 3 }}} = Links = * [http://www.gnu.org/software/gdb/documentation/ GDB-Dokumentation] {en} * [:Programmierung:] {Übersicht} Übersichtsartikel #tag: Programmierung, Debugging