====== 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