⇤ ← Revision 1 vom 2019-10-22 20:35:49
4879
Kommentar:
|
4931
|
Gelöschter Text ist auf diese Art markiert. | Hinzugefügter Text ist auf diese Art markiert. |
Zeile 8: | Zeile 8: |
Alle Demo-Projekte enthalten eine GDB Startup Datei ``.eside/gdbinit``. | Alle Demo-Projekte enthalten eine GDB Startup Datei ``.estool/gdbinit``. |
Zeile 14: | Zeile 14: |
``br`` statt ``breakpoint``. | ``br`` oder ``b`` statt ``breakpoint``. |
Zeile 26: | Zeile 26: |
Breakpoints kann man löschen mit ``del <Num>``. Man kann sie auch | **Breakpoints** kann man löschen mit ``del <Num>``. Man kann sie auch |
Zeile 31: | Zeile 31: |
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``. |
**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``. |
Zeile 34: | Zeile 33: |
Variablen ausgeben mit ``p <variable>``. | **Variablen** ausgeben mit ``p <variable>``. |
Zeile 36: | Zeile 35: |
Lokale Variable ausgeben mit <Funktion>::<Variable>: | **Lokale** Variable ausgeben mit <Funktion>::<Variable>: |
Zeile 44: | Zeile 43: |
Adressen von globalen Variablen ausgeben am Beispiel von ``globavar``: | Adressen von globalen Variablen ausgeben am Beispiel von ``globvar``: |
Zeile 51: | Zeile 50: |
Anregung: Definieren Sie Variablen in unterschiedlichen Speicherabschnitten und | *Anregung:* Definieren Sie Variablen in unterschiedlichen Speicherabschnitten und |
Zeile 63: | Zeile 62: |
Displays. Man kann sich mit ``display`` Variablen und Register | **Displays.** Man kann sich mit ``display`` Variablen und Register |
Zeile 73: | Zeile 72: |
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 | **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 |
Zeile 94: | Zeile 93: |
GDB "Oberfläche" auf mehrere Fenster umschalten, in denen | GDB "Oberfläche" auf **mehrere Fenster** umschalten, in denen |
Zeile 100: | Zeile 99: |
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. |
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. |
Zeile 112: | Zeile 110: |
Watchpoints unterbrechen den Programmablauf, wenn eine Variable geschrieben oder |
**Watchpoints** unterbrechen den Programmablauf, wenn eine Variable geschrieben oder |
Zeile 118: | Zeile 115: |
Kommandos mit Breakpoints verknüpfen. Das folgende Beispiel legt ein print | **Kommandos** mit Breakpoints verknüpfen. Das folgende Beispiel legt ein print |
Zeile 129: | Zeile 126: |
Bedingter Breakpoint | **Bedingter Breakpoint** |
Zeile 136: | Zeile 133: |
Bedingter Breakpoint, zusätzlich mit Kommandoliste: | **Bedingter Breakpoint**, zusätzlich mit Kommandoliste: |
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.