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