assignments/help/gdb.md

54 lines
2.6 KiB
Markdown

# Der GNU Debugger (gdb)
## Installation
Der GNU Debugger (gdb) ist auf den meisten Systemen bereits installiert. Sollte er bei Ihnen fehlen, können Sie ihn mit dem Kommando `sudo apt install gdb` installieren.
## Konfiguration
`gdb` verwendet standardmäßig die AT&T-Syntax für die Ausgabe von Assembler-Befehlen. Da dies aber die unüblichere Form ist, werden wir ausschließlich die Intel-Syntax verwenden. Sie können `gdb` nach jedem Aufruf mit dem Kommando `set disassembly-flavor intel` auf die Intel-Syntax umstellen. Einfacher ist es jedoch, diese Einstellung dauerhaft abzulegen. Erzeugen Sie hierzu einfach eine Datei `.gdbinit` in Ihrem Home-Verzeichnis und schreiben Sie dort das Kommando für die Syntax hinein.
```console
$ echo "set disassembly-flavor intel" > ~/.gdbinit
```
## Wichtige Kommandos
Sie laden ein Programm, indem Sie den Pfad zum Programm nach dem Aufruf von `gdb` angeben, also z.B. `$ gdb ./crackme`.
Wenn Sie `gdb` gestartet haben, können Sie hinter dem Prompt `(gdb)` Ihre Kommandos eingeben. Einige wichtige Kommandos sind:
* `run` oder `r`: Startet das Programm
* CTRL-C: Unterbricht das Programm
* `backtrace` oder `bt`: Zeigt den Stack an
* `frame NO`: Springt zum Frame mit der angegebenen Nummer
* `disassemble` oder `disas`: Disassembliert die Funktion für den aktuellen Stack-Frame
* `break` oder `b`: Setzt einen Breakpoint. Hierbei können Sie angeben
- Funktionsnamen: `break strcmp`
- Adresse: `break *0x7ffff7f39660`
* `continue` oder `c`: Setzt das Programm fort
* `x`: Untersucht eine Speicherstelle, d.h. der übergebene Wert wird als Adresse interpretiert
- als Hexadezimalwert: `x /x $rdi` oder `x /x 0x555555559ac0`
- als Dezimalwert: `x /d $rdi` oder `x /d 0x555555559ac0`
- als Fließkommazahl: `x /f $rdi` oder `x /f 0x555555559ac0`
- als String: `x /s $rdi` oder `x /s 0x555555559ac0`
- als Instruktionen: ` x /i $rip` oder `x /i 0x555555559ac0`
- es können mehrere Werte auf einmal ausgegeben werden, z.B. `x /10x $rdi`
* `print` oder `p`: Gibt einen Wert aus
- eines Registers: `p $rdi`
- eines Ausdrucks: `p 2*2`
- Sie können auch die Flags `/x`
* CTRL-D: Beendet den Debugger
Sowohl `print` als auch `x` unterstützen sogenannte Formatzeichen, die angeben, wie der Wert zu interpretieren und formatieren ist:
* `x`: Hexadezimal
* `d`: Vorzeichenbehaftete Dezimalzahl
* `u`: Vorzeichenlose Dezimalzahl
* `o`: Octal
* `t`: Binär
* `a`: Adresse (hexadezimal + Offset zu nächsten bekannten Symbol)
* `c`: ASCII-Zeichen
* `f`: Fließkommazahl
* `s`: String (nur `x`)