KnowHow - Software - GDB
Du brauchst GDB. Und nun?
GDB ist hypersuperextremkompliziert. Es ist noch variabler als ein Schweizer Messer, aber ich würde sagen, es gibt wohl keinen Menschen auf diesem Planeten der GDB einfach so bedienen kann ohne Anleitung lesen zu müssen.
Das ist
grundfalsch. Damit ich also etwas mit GDB anfangen kann hier was ich mir niemals merken kann:
Die wenigen wichtigen GDB Befehle
Was ich brauche ist eigentlich nur sehr wenig:
- Breakpoints setzen und entfernen
- Single-Stepping bis zu einer Stelle
- Disassemblierung der aktuellen PC-Position oder eines Speicherbereichs
- Manipulierung von Registern, z. B. um den PC anders zu setzen
All das geht mit GDB. Aber nicht einfach so wie man sich das vielleicht denkt! Hier die Reihenfolge der Befehle wie ich sie so normalerweise brauche. Hinweis: GDB führt beim Drücken von RETURN immer den letzten Befehl aus. Das ist recht praktisch.
- step: Führt das Program aus bis es die Routine verlässt (oder so), jedenfalls ist es gut nach einem attach erst ein paar mal "step" reinzuhauen damit man eine Übersicht darüber bekommt wo sich das Programm bewegt (meist loopt es ja mehr oder weniger sinnlos in der Gegend rum, warum will man sonst den Debugger?)
- stepi: Single stepping, also immer nur eine Instruktion, bis man eine geeignete Position für den Breakpoint gefunden hat
- break *0xadresse: Setzt einen Breakpoint. Man beachte den Stern (warum? Keine Ahnung, ist so bei GDB). Der Breakpoint hält immer die Ausführung an.
- cont: Führt das Programm aus bis es auf einen Breakpoint trifft.
- disas: Disassembliert die aktuelle Funktion um den PC herum. Wenn man ein Programm ohne Symboltabelle hat sind das oft Megabyteweise disassemblierter Code bis man an die Stelle kommt an der man gucken will.
- x/i 0xadresse: Disassembliert die angegebene Adresse. x/i $pc Disassembliert die aktuelle PC-Position. x/10i $pc disassembliert die nächsten 10 Instruktionen.
- x/8xb: Zeigt ein "poor man's hexdump", "x/8c" zeigt dann die ASCII-Repräsentation. Insgesamt ist es schon sehr schwach dass man ein standard-Hexdump eines Speicherbereichs nicht anzeigen kann (das ging schon auf dem C64).
- x/a 0xadresse: Zeige die im Speicher abgelegte Adresse (also 4 Bytes).
- info registers: Die Prozessorregister. Alle möglichen Register findet man mit info all-registers
- info break: Listet die Breakpoints so dass man sie mit disable N abschalten kann
- set $pc=0xadresse: Setzt die nächste auszuführende Instruktion. Es geht auch set $pc+=4 oder so.
Ziemlich nutzlose Kommandos
- where: Bei Programmen ohne Symboltabelle (Normalfall!) ist das Kommando recht nutzlos. Bei Programmen die mit -g übersetzt wurden ist es hingegen extrem hilfreich.
Fazit
Wer GDB einfach so verwenden muss ist ein armes Schwein. Was es braucht wäre ein einfaches Commandline(!) Tool das GBD in ein verwendbares Monster verwandelt, d. h. per Curses einfach das Disassembly einblendet und die aktuelle Position und man damit das Programm sauber und einfach debuggen kann. Hilfreich dabei ist "set annotate 2".
-Tino, 2006-07-26