mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Anleitung für gdb Debugger


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Oh, eine Drääääne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich würde gerne wissen, ob jemand hier eine gute Anleitung für den 
Umgang mit dem Debugger gdb kennt, vor allem in Hinsicht auf STM32.
Am Besten so einfach wie möglich, aber dennoch gründlich.

Danke!

Autor: Md M. (Firma: Potilatormanufaktur) (mdma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einfach googlen und die ersten Links klicken. Lesen musst du schon 
selber. Probier mal das hier 
https://www.oreilly.de/german/freebooks/rlinux3ger/ch142.html

Autor: Oh, eine Drääääne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, ich habe auf irgendwelche besonders guten Empfehlungen gehofft.
Aber inzwischen bin ich auch schon zumindest ein bisschen weiter.

Ich habe jetzt einen Symbol Table aus einer Executable geladen, die mit 
-g3 kompiliert wurde.
Allerdings finde ich absolut nichts dazu, wie ich nun die Register 
auslesen kann, wie z.B. RCC_APB1RSTR oder GPIOA_CRL oder so.
Mit "p /x GPIOA_CRL" bekomme ich immer nur "No symbol "GPIOA_CRL" in 
current context.
Wieso und wie kann ich das lösen?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> No symbol "GPIOA_CRL"

Vielleicht weil GPIOA_CRL kein Symbol ist sondern ein Makro?

Autor: Oh, eine Drääääne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann L. schrieb:
>> No symbol "GPIOA_CRL"
>
> Vielleicht weil GPIOA_CRL kein Symbol ist sondern ein Makro?

Mit Symbol sind aber ja eigentlich quasi die Bezeichner von Variablen 
gemeint, oder nicht?
Weil mit GPIOA->CRL passiert genau das gleiche. Und hier ist es ein 
Bezeichner.

Autor: Alexander F. (alexf91)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, eine Drääääne schrieb:
> Mit Symbol sind aber ja eigentlich quasi die Bezeichner von Variablen
> gemeint, oder nicht?

Ein Makro wird, im Gegensatz zu Variablen oder Konstanten, schon vom 
Präprozessor ersetzt. Der Compiler sieht den Namen GPIOA nie und kann 
also auch keine Debug-Informationen dafür erstellen.

Autor: Md M. (Firma: Potilatormanufaktur) (mdma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, eine Drääääne schrieb:
> ich habe auf irgendwelche besonders guten Empfehlungen gehofft.

Kann ja keiner wissen, wie weit du da schon bist und was du brauchst. 
Der Link war eher so zum Einstieg gedacht, mal breakpoints ausprobieren 
und so. Und bei STM32 bin ich (leider noch) auch schon raus.

Autor: Oh, eine Drääääne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Md M. schrieb:
> Und bei STM32 bin ich (leider noch) auch schon raus.

Ich offensichtlich auch.
Aber ich will es zumindest versuchen, weil mich gerade ein Problem dabei 
ziemlich irre macht und ich den Fehler absolut nicht finde.

Alexander F. schrieb:
> Oh, eine Drääääne schrieb:
>> Mit Symbol sind aber ja eigentlich quasi die Bezeichner von Variablen
>> gemeint, oder nicht?
>
> Ein Makro wird, im Gegensatz zu Variablen oder Konstanten, schon vom
> Präprozessor ersetzt. Der Compiler sieht den Namen GPIOA nie und kann
> also auch keine Debug-Informationen dafür erstellen.

Aber Variablen. Und GPIOA ist eigentlich eine Variable vom Typ 
GPIO_TypeDef. Das finde ich wie gesagt aber auch nicht.
Ich habe auch schon extra eine Variable angelegt, die findet er 
irgendwie auch nicht.
Ich kompiliere mit -g3 und -O0.
Dann nutze ich "st-util -p 4500" und "gdb" und im gdb-terminal dann 
"target remote localhost:4500". Dann mit "file /path/to/executable" die 
Symbole laden und dann kommt bei "p /x var" wieder die Meldung heraus. 
Habe ich einen Schritt vergessen?

Autor: Alexander F. (alexf91)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, eine Drääääne schrieb:
> Und GPIOA ist eigentlich eine Variable vom Typ GPIO_TypeDef.

Bist du dir da sicher?
Ich hab mir jetzt die STM32 Standard Peripheral Library heruntergeladen. 
Da ist GPIOA ein Makro:
#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)

Autor: Oh, eine Drääääne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alexander F. schrieb:
> Oh, eine Drääääne schrieb:
> Und GPIOA ist eigentlich eine Variable vom Typ GPIO_TypeDef.
>
> Bist du dir da sicher?
> Ich hab mir jetzt die STM32 Standard Peripheral Library heruntergeladen.
> Da ist GPIOA ein Makro:#define GPIOA               ((GPIO_TypeDef *)
> GPIOA_BASE)

Ups. Dazu sage ich jetzt mal lieber nichts mehr...

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Alexander F. schrieb:
> Ein Makro wird, im Gegensatz zu Variablen oder Konstanten, schon vom
> Präprozessor ersetzt. Der Compiler sieht den Namen GPIOA nie und kann
> also auch keine Debug-Informationen dafür erstellen.

Dann lies dir mal die Dokumentation zu -g3 durch …

Der „Präprozessor“ ist halt schon lange kein separater Prozess mehr
sondern ein inhärenter Bestandteil des Compilers.  Daher ist auch er
in der Lage, Debuginformationen an den eigentlichen Compiler
durchzureichen.

Falls du es nicht glaubst:
j@uriah 1076% cat foo.c
#define FOO 42

int main(int argc, char **argv)
{
  int i = FOO;
  i *= argc;
  return i;
}
j@uriah 1077% gcc6 -g3 -o foo foo.c
j@uriah 1078% gdb801 -q foo
Reading symbols from foo...done.
(gdb) b 5
Breakpoint 1 at 0x400771: file foo.c, line 5.
(gdb) r a
Starting program: /junk/FreeBSD/ports/devel/avr-gcc/foo a

Breakpoint 1, main (argc=2, argv=0x7fffffffe4c0) at foo.c:5
5         int i = FOO;
(gdb) p FOO
$1 = 42
(gdb) c
Continuing.
[Inferior 1 (process 68188) exited with code 0124]
(gdb) quit

Autor: Alexander F. (alexf91)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg W. schrieb:
> Dann lies dir mal die Dokumentation zu -g3 durch …

Oh, das wusste ich nicht.
Zur Vollständigkeit ist hier der Abschnitt zu -g3 aus der gcc Manpage:
> Level 3 includes extra information, such as all the macro definitions present
> in the program.  Some debuggers support macro expansion when you use -g3.

Autor: Christopher J. (christopher_j23)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, eine Drääääne schrieb:
> Weil mit GPIOA->CRL passiert genau das gleiche. Und hier ist es ein
> Bezeichner.

Könnte es eventuell sein, dass du einen neueren STM32 nutzt, der gar 
keine GPIO_CRL und GPIO_CRH hat?

So lange mit -g3 kompiliert wird funktioniert bei mir der Zugriff z.B. 
auf GPIOA->ODR (bei einem Nucleo-F411RE) absolut problemlos mittels
^C
Program received signal SIGINT, Interrupt.
0x080002d2 in delay (time=time@entry=200) at src/main.c:19
19              for (volatile unsigned j=0; j<20000; j++);
(gdb) p /x GPIOA->ODR
$1 = 0x20
(gdb) p /t GPIOA->ODR
$2 = 100000
(gdb)

Oh, eine Drääääne schrieb:
> Habe ich einen Schritt vergessen?

Vielleicht noch vergessen das Binary zu laden?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.