GDB Befehle für das ES2 Praktikum
Alle Demo-Projekte enthalten eine GDB Startup Datei .eside/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 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 globavar:
(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.