#format rst #language de 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 ``. Man kann sie auch deaktivieren/aktivieren mit ``disable `` und ``enable ``. 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 ``. **Lokale** Variable ausgeben mit ::: :: (arm-gdb) p main::loopcnt $2 = 0x4e Adressen von globalen Variablen ausgeben am Beispiel von ``globvar``: :: (arm-gdb) p &globvar $1 = (int *) 0x2000000c *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 : 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.