GDB Befehle für das ES2 Praktikum
Alle Demo-Projekte enthalten eine GDB Startup Datei .estool/gdbinit.
GDB immer im "Text User Interface" Modus starten (Option --tui, siehe Makefile).
GDB vervollständigt viele Eingaben durch Drücken der Tablulator Taste. Jedes Kommando kann verkürzt eingegeben werden, solange es eindeutig ist. Zum Beispiel br oder b statt breakpoint.
In GDB bekommt man einen Hilfetext durch das help Kommando:
(arm-gdb) help breakpoint
Breakpoints ausgeben:
(arm-gdb) info br Num Type Disp Enb Address What 1 breakpoint keep y 0x0800015e in main at main.c:47
Breakpoints kann man löschen mit del <Num>. Man kann sie auch deaktivieren/aktivieren mit disable <Num> und enable <Num>. Mit cont führt man das Programm bis zum nächsten Breakpoint (oder bis zum Programmende) aus.
Breakpoint z.B. auf Funktion toggle_led() setzen: br toggle_leds. Die Funktionsnamen vervollständigt GDB durch die TAB Taste. Man kann auch Zeilennummern verwenden, z.B. br 192.
Variablen ausgeben mit p <variable>.
Lokale Variable ausgeben mit <Funktion>::<Variable>:
(arm-gdb) p main::loopcnt $2 = 0x4e
Adressen von globalen Variablen ausgeben am Beispiel von globvar:
(arm-gdb) p &globvar $1 = (int *) 0x2000000c <globvar>
Anregung: Definieren Sie Variablen in unterschiedlichen Speicherabschnitten und finden Sie die Adressen:
int g_bss; int g_data = 4; uint8_t g_array[] = {2, 14, 29, 7, 0}; const int g_cdata = 5;
Ordnen Sie die gefundenen Adressen in die Abschnitte des Linker-Scripts ein. Schauen Sie sich in diesem Zusammenhang auch das GCC Werkeug arm-none-eabi-nm an. Es findet Adressen in ausführbaren Programmen.
Displays. Man kann sich mit display Variablen und Register automatisch nach jedem Breakpoint anzeigen lassen:
br 192 display hADCxConvertedData_Temperature_DegreeCelsius
Ein Display löscht man wieder mit dem undisplay Kommando.
Ausgeben des Speichers ("memory dump"). Die Variable g_data hat den Wert 4. Aufpassen: Das Kommando x/1xw g_data interpretiert den Wert von g_data als Adresse auf den Speicher! Der meist gewünschte Output wird erst durch x/1xw &g_data erreicht.
(arm-gdb) x/1xw g_data 0x4: 0x080001c5 (arm-gdb) x/1xw &g_data 0x20000000 <g_data>: 0x00000004
Geben Sie alle Elemente von g_array aus. Dazu müssen Sie das Kommando x modifizieren, eine Hilfe bekommen Sie durch (arm-gdb) help x.
Variable auf neuen Wert setzen:
(arm-gdb) set var g_bss = 21
GDB "Oberfläche" auf mehrere Fenster umschalten, in denen der C Quelltext, die Assemblerbefehle und die Kommandos stehen:
(arm-gdb) C-x 2
Die Angabe C-x 2 bedeutet: zunächst Steuerung-x drücken, Finger weg, dann die 2 drücken. Mehrfaches C-x 2 schaltet verschiedene Ansichten durch.
Programm wieder von Anfang an ausführen:
(arm-gdb) monitor reset halt (arm-gdb) continue
In gdbinit gibt es dazu das selbst definierte Kommando debug-program.
Watchpoints unterbrechen den Programmablauf, wenn eine Variable geschrieben oder gelesen wird:
(arm-gdb) watch hADCxConvertedData_Temperature_DegreeCelsius
Kommandos mit Breakpoints verknüpfen. Das folgende Beispiel legt ein print Kommando für den Breakpoint Nr. 5 an. Es können auch mehrere Kommandos vor dem end aufgenommen werden. Nach jedem Breakpoint Nr. 5 wird die Kommando-Liste abgearbeitet.
commands 5 p hADCxConvertedData_Temperature_DegreeCelsius end
Bedingter Breakpoint
(arm-gdb) br 192 if hADCxConvertedData_Temperature_DegreeCelsius == 19
Bedingter Breakpoint, zusätzlich mit Kommandoliste:
set $tmp = hADCxConvertedData_Temperature_DegreeCelsius b 192 if $tmp != hADCxConvertedData_Temperature_DegreeCelsius commands set $tmp = hADCxConvertedData_Temperature_DegreeCelsius p hADCxConvertedData_Temperature_DegreeCelsius continue end
GDB Kommandos lassen sich in eine Textdatei schreiben und auf dem GDB Prompt mit source ausführen, z.B.
(arm-gdb) source gdbcmd
Die Datei mit den Kommandos heisst hier gdbcmd, sie kann einen beliebigen Namen haben.