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. Mit C-x o kann man den Fokus nacheinander auf jedes Fenster legen.

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.