====== GDB ======
:!: **Aktuelle Version** ist die 8.1 (Stand: 02.02.2018).
Programm in den Debugger GDB laden:
gdb /Pfad/ProgrammName
Mit dem Parameter **-tui** startet man GDB im TUI-Modus (TextUserInterface):
gdb -tui /Pfad/ProgrammName
Um ein **CoreDump** zu untersuchen, braucht man beides - die ausführbare Datei und das CoreDump selbst:
gdb /Pfad/ProgrammName /Pfad/CoreDump
===== Kurzübersicht von GDB-Kommandos =====
^Kommando ^Beschreibung ^Beispiel ^Kommentar ^
|attach __PID__ |In einen bereits laufenden (falls notwendig) Prozeß (mit __PID__) einklinken. |attach 254 |Der GDB muss mit "gdb /Pfad/ProgrammName" bereits gestartet sein.\\ Oder gleich beim GDB-Start in den Prozeß einklinken: "gdb /Pfad/ProgrammName 254". |
|set directory __Pfad__ |Setzt den Pfad zu den Quelltexten. |set directory\\ %%/Pfad/zum/Source%% | |
|show directories |Zeigt den Pfad zu den Quelltexten. | | |
|**l**ist |Mehrere Codezeilen anzeigen. | |Wiederholt ausgeführt, wird die nächste Portion des QuellCodes ausgegeben. |
|break __N__ |Breakpoint in die Zeile __N__ setzen. |break 19 |Setzt den Breakpoint an die Zeile 19. |
|break __FunktionName__ |Breakpoint auf die Funktion __FunktionName__ setzen. |break main | |
|break __FileName.c__:__N__|Breakpoint in die Zeile __N__ im File __FileName.c__ setzen. |break __foo.c__:__38__ | |
|break __N__ if (__Ausdruck__)|Breakpoint in die Zeile __N__ setzen, angehalten wird aber nur wenn der __Ausdruck__ wahr ist. |break __184__ if (__status == 0__) |"status" muß entweder eine globale Variable oder eine lokale Variable aus dem aktuellen Stack Frame sein. |
|clear __FunktionName__\\ clear __FileName:FunktionName__ |Alle Breakpoints aus der Funktion __FunktionName__ entfernen. | | |
|clear __N__\\ clear __FileName:N__ |Breakpoint aus der Zeile __N__ im File __FileName__ entfernen. | | |
|delete __N__ |Breakpoint mit der Nr. __N__ entfernen. | |Die Nummern mit __info break__ herausfinden. |
|info break |Liste aller Breakpoints und Watchpoints samt ihrem Status anzeigen lassen. | | |
|help break |Überblick über die komplette Syntax von "break". | | |
|watch |Setzt einen Watchpoint (Beobachtungspunkt). | | |
|run __Argumente__ |Startet das Programm. | | |
|**n**ext |Einzelschrittmodus, geht bis zur nächsten Codezeile in derselben Funktion. | | |
|**s**tep |Einzelschrittmodus, geht in die Funktion rein. | | |
|**bt** oder backtrace |Gibt das TraceFrame (Call Stack) aus. | |Die unterste Funktion ist i.d.R. die main(). |
|until __N__ |Den Code (ohne Unterbrechnungen) bis zur Zeile __N__ ausführen. |until __27__ |Führt den Code aus und hält anschließend in der Zeile __27__. |
|**c**ontinue |Programm weiter laufen zu lassen. | | |
|**p**rint __VariablenName__|Zeigt den Wert einer __Variablen__ an. | |...oder den Wert eines Funktionsaufrufs:\\ %%(gdb) print getpid()%%\\ ...oder auch einen Wert zuweisen:\\ %%(gdb) print mydisplay->vendor = "Linux"%% |
|ptype |Detaillierte Informationen über den Typ einer Variablen oder die Definition von __struct-__ und __typedef-__Anweisungen. | | |
|x |Arbeitsspeicher untersuchen.\\ "x" akzeptiert eine Speicheradresse (z.B. Variablenname) als Argument. |Beispiel:\\ (gdb) x mydisplay->vendor\\ 0x9de70 <_end+35376>: 76 'L'\\ (gdb) x/6c mydisplay->vendor\\ 0x9de70 <_end+35376>: 76 'L' 105 'i' 110 'n' 117 'u' 120 'x' 0 ''\\ (gdb) x/s mydisplay->vendor\\ 0x9de70 <_end+35376>: "Linux"\\ (gdb) | |
|finish |Die Funktion bis zu ihrem Ende ablaufen lassen. | | |
|info __Option__ |Zeigt Informationen (je nach __Option__) über den Status des analysierten Programms an. | | |
|info program |Informationen zum Ablaufstatus des Programms. | | |
|info locals |Namen und Werte aller lokalen Variablen in der aktuellen Funktion anzeigen lassen. | | |
|info frame |Informationen über den aktuellen Stack Frame. | | |
|help __info__ |Alle Unterbefehle von __info__ anzeigen lassen. | | |
|quit |GDB verlassen. | | |
^Thread-Kommandos ^Beschreibung ^Beispiel ^Kommentar ^
|info threads |Infos über existierende Threads anzeigen. | | |
|thread __Thread-ID__ |Zum Thread mit der "Thread-ID" wechseln. | | |
|maint info sol-threads |Infos über Solaris-User-Threads anzeigen. | |Solaris-spezifisch. |
|thread name __Name__ |Dem aktuallen Thread einen Namen "Name" zuweisen.\\ Ohne Argument aufgerufen, wird der vorher zugewiesene Name entfernt. | |Auf diese Weise gesetzte Namen werden durch das Kommando "info threads" angezeigt. |
^all-stop mode ^^^^
|show scheduler-locking |Zeigt den aktuellen SchedulerLocking-Modus an. | | |
|set scheduler-locking __mode__ |Setzt den SchedulerLocking-Modus auf den Wert __mode__: "off", "on" oder "step". | |**off** - kein Locking, alle Threads können laufen wie sie wollen.\\ **on** - nur der aktuelle Thread läuft, die anderen werden angehalten.\\ **step** - optimisiert für single-stepping. Das hindert andere Threads am Nebenlauf mit dem aktuellen Thread während Sie schrittweise debuggen, so dass der Debugger nicht von einem zu dem anderen Thread springt. |
|show schedule-multiple | | | |
|set schedule-multiple __mode__ | | | |
^non-stop mode ^^^^
|set pagination off\\ set non-stop on | | |:!: Den Modus vor dem Start (oder Attach) des Programms setzen. |
|show non-stop |Zeigt den aktuellen NonStop-Modus an. | | |
|set non-stop __mode__ |Setzt den NonStop-Modus auf den Wert __mode__: "off" oder "on". | | |
===== Infos zu GDB =====
The GNU Project Debugger: [[https://www.gnu.org/software/gdb/]]
* Doku: [[http://sourceware.org/gdb/download/onlinedocs/]]
Einige interessante Ansätze mit GDB: [[https://www.oreilly.de/german/freebooks/rlinux3ger/ch142.html]] (wie z.B. "Eine Core-Datei analysieren")
CGDB - the curses debugger: [[http://cgdb.github.io/]]
----
Stand: 21.03.2017
EOF