forked from ree-lecture/assignments
54 lines
2.6 KiB
Markdown
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`)
|