Forum: Mikrocontroller und Digitale Elektronik Flashing und Debugging mit gdb und BMP


von Christoph K. (chriskuku)


Angehängte Dateien:

Lesenswert?

Brauche noch mal etwas Starthilfe. Bei OpenOCD erinnerte ich mich, daß 
das Image, das man mit file und load angegeben hatte, automatisch 
geflasht wurde.

Jetzt, mit dem (XTW) ST-LINK V2 Stick fehlt mir noch der Schritt zum 
Flashen.

Ich kann folgendes bisher machen:
1
$ arm-none-eabi-gdb
2
GNU gdb (GNU Tools for Arm Embedded Processors 8-2018-q4-major) 8.2.50.20181213-git
3
Copyright (C) 2018 Free Software Foundation, Inc.
4
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
5
This is free software: you are free to change and redistribute it.
6
There is NO WARRANTY, to the extent permitted by law.
7
Type "show copying" and "show warranty" for details.
8
This GDB was configured as "--host=x86_64-apple-darwin10 --target=arm-none-eabi".
9
Type "show configuration" for configuration details.
10
For bug reporting instructions, please see:
11
<http://www.gnu.org/software/gdb/bugs/>.
12
Find the GDB manual and other documentation resources online at:
13
    <http://www.gnu.org/software/gdb/documentation/>.
14
15
For help, type "help".
16
Type "apropos word" to search for commands related to "word".
17
(gdb) target extended-remote /dev/cu.usbmodem7AAF76931
18
Remote debugging using /dev/cu.usbmodem7AAF76931
19
(gdb) file ./kernel.elf
20
Reading symbols from ./kernel.elf...
21
(gdb) mon swdp_scan
22
Target voltage: 3.28V
23
Available Targets:
24
No. Att Driver
25
 1      STM32F40x M4
26
(gdb) attach 1
27
Attaching to program: /Users/kuku/kernel.elf, Remote target
28
0x5b93b93e in ?? ()
29
(gdb) load kernel.elf 0x08000000
30
Loading section .text, size 0x2864 lma 0x8000000
31
Start address 0x0, load size 10340
32
Transfer rate: 23 KB/sec, 940 bytes/write.
33
(gdb) 
34
(gdb) x/10 0
35
0x0:  Cannot access memory at address 0x0
36
(gdb)


Aber wie weiter? War das schon das flashen (load)?

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Probier's mal mit "monitor reset halt", danach "load". So funktioniert 
das jedenfalls mit OpenOCD und dem Atmel-ICE.

Das "monitor"-Kommando im GDB schiebt die Argumente als Kommando an den 
GDB-Server, also das "reset halt" wird von diesem ausgewertet.

Beitrag #6500007 wurde vom Autor gelöscht.
von Johannes S. (Gast)


Lesenswert?

Mon Reset halt kennt bmp nicht, das load schreibt schon ins Flash.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Johannes S. schrieb:
> das load schreibt schon ins Flash.

Das sowieso, aber irgendwie muss man doch einen Reset auslösen können, 
oder?

von Jim M. (turboj)


Lesenswert?

Christoph K. schrieb:
> (gdb) x/10 0
> 0x0:  Cannot access memory at address 0x0

Da is (im GDB) nix gemappt an Adresse 0.  Flash startet im STM32 ab 
Adresse 0x8000000.

von Christoph K. (chriskuku)


Lesenswert?

Jim M. schrieb:
> Christoph K. schrieb:
>> (gdb) x/10 0
>> 0x0:  Cannot access memory at address 0x0
>
> Da is (im GDB) nix gemappt an Adresse 0.  Flash startet im STM32 ab
> Adresse 0x8000000.

Ja, danke. Das war nämlich noch das, was mich wunderte. Die Relocation 
Adresse wird doch beim Laden (load) angegeben. Und was muß man im GDB 
noch mappen? Als ich mit OpenOCD gearbeitet hatte, war das Problem nicht 
da. Da gab ich nur den .elf file an. Arbeitet der mit BMP geflashte 
(XTW) Stick auch als reiner ST-LINK mit OpenOCD? Der hat ja zwei 
Devices:

crw-rw-rw- 1 root  wheel 18, 9   5 Dez 07:41 /dev/cu.usbmodem7AAF76931
crw-rw-rw- 1 root  wheel 18, 11  5 Dez 07:41 /dev/cu.usbmodem7AAF76933

: Bearbeitet durch User
von Christoph K. (chriskuku)


Lesenswert?

Mein Fehler. Beim Makefile in der ld-Phase hatte ich noch einen Fehler 
drin. kernel.ld file fehlte. Allerdings noch nicht ganz gelöst. Gibt 
immer noch "load failed".

Wenn ich einen anderen .elf file nehme, der schon mal unter OpenOCD 
funktioniert hat, dann kriege ich:
1
(gdb) load
2
`/Users/kuku/firmware.elf' has changed; re-reading symbols.
3
Loading section .text, size 0x3bc8 lma 0x8000000
4
Start address 0x8003a56, load size 15304
5
Transfer rate: 31 KB/sec, 956 bytes/write.
6
(gdb) x/10 0
7
0x0:  Cannot access memory at address 0x0
8
(gdb)
memmap:
1
MEMORY
2
{
3
   rom(RX)   : ORIGIN = 0x08000000, LENGTH = 0x4000
4
   ram(WAIL) : ORIGIN = 0x20000000, LENGTH = 0x4000
5
}
6
7
SECTIONS
8
{
9
   .text : { *(.text*) } > rom
10
   .bss  : { *(.bss*) } > ram
11
}

: Bearbeitet durch User
von Christoph K. (chriskuku)


Lesenswert?

Habe gerade noch mal versucht, zurückzuschalten auf Dinge, die 
funktioniert haben, aber jetzt auch nicht mehr funktionieren. Gut, es 
war das DISCO, was funktioniert hat. Jetzt habe ich das Nucleo mit 
seinem ST-LINK genommen und zunächst mal unter WIndows mit ST-Link 
Utility das Nucleo geflasht mit einer Applikation. Die läuft über die 
VCOM und ich kann interagieren mit
1
$ picocom -b 115200 /dev/cu.usbmodem14203 --imap lfcrlf,crcrlf --omap delbs,crlf

Dann OpenOCD aufgerufen:
1
xPack OpenOCD, x86_64 Open On-Chip Debugger 0.10.0+dev-00378-ge5be992df (2020-06-26-12:31)
2
Licensed under GNU GPL v2
3
For bug reports, read
4
  http://openocd.org/doc/doxygen/bugs.html
5
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
6
srst_only separate srst_nogate srst_open_drain connect_deassert_srst
7
8
Info : Listening on port 6666 for tcl connections
9
Info : Listening on port 4444 for telnet connections
10
Info : clock speed 2000 kHz
11
Info : STLINK V2J34M25 (API v2) VID:PID 0483:374B
12
Info : Target voltage: 3.225638
13
Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints
14
Info : starting gdb server for stm32f4x.cpu on 4242
15
Info : Listening on port 4242 for gdb connections

gdb aufgerufen:
1
$ ls *.elf
2
firmware.elf
3
$ ./GDB
4
GNU gdb (GNU Tools for Arm Embedded Processors 8-2018-q4-major) 8.2.50.20181213-git
5
Copyright (C) 2018 Free Software Foundation, Inc.
6
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
7
This is free software: you are free to change and redistribute it.
8
There is NO WARRANTY, to the extent permitted by law.
9
Type "show copying" and "show warranty" for details.
10
This GDB was configured as "--host=x86_64-apple-darwin10 --target=arm-none-eabi".
11
Type "show configuration" for configuration details.
12
For bug reporting instructions, please see:
13
<http://www.gnu.org/software/gdb/bugs/>.
14
Find the GDB manual and other documentation resources online at:
15
    <http://www.gnu.org/software/gdb/documentation/>.
16
17
For help, type "help".
18
Type "apropos word" to search for commands related to "word".
19
(gdb) file firmware.elf
20
Reading symbols from firmware.elf...
21
(No debugging symbols found in firmware.elf)
22
(gdb) target extended-remote /dev/cu.usbmodem14203
23
Remote debugging using /dev/cu.usbmodem14203
24
Ignoring packet error, continuing...
25
warning: unrecognized item "timeout" in "qSupported" response
26
Ignoring packet error, continuing...
27
Remote replied unexpectedly to 'vMustReplyEmpty': timeout
28
(gdb)

Wieso funktioniert OpenOCD auf einmal nicht mehr?

: Bearbeitet durch User
von Required Field (Gast)


Lesenswert?

>Wieso funktioniert OpenOCD auf einmal nicht mehr?

Weil Du mit OOCD laut

>Info : Listening on port 4242 for gdb connections

über den Port 4242 sprechen sollst und nicht über

>Remote debugging using /dev/cu.usbmodem14203

Beitrag #6500523 wurde von einem Moderator gelöscht.
von Christoph K. (chriskuku)


Lesenswert?

Kann's leider nicht mehr löschen. Ich muß ja zum serverport verbinden.

Gut, also die Strecke funktioniert. Zurück zu BMP:
Bleibt also das Problem, daß das memory mapping im gdb im Falle 
blackmagic nicht funktioniert.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Christoph K. schrieb:
> Bleibt also das Problem, daß das memory mapping im gdb im Falle
> blackmagic nicht funktioniert.

GDB kann dem GDB-Server ein memory mapping (in Form eines kleinen 
XML-Snippets) rüberreichen. Könnte es sein, dass Blackmagic das nicht 
unterstützt und dass die Probleme damit zusammen hängen?

Habe sowas vor Jahren für AVaRICE mal implementiert.

Ich stecke allerdings in deinem Projekt zu wenig drin, um dir fundiert 
helfen zu können, bin halt nur kreuz und quer bei ähnlichen 
Veranstaltungen schon mal lang gekommen.

ps: Irgendeine Doku, was ihre Firmware auf GDB-Server-Seite als 
Protokoll unterstützt, finde ich bei denen leider nicht, und die 
Firmware scheint auch nicht Opensource zu sein.

: Bearbeitet durch Moderator
von Required Field (Gast)


Lesenswert?

Christoph K. schrieb:
> Bleibt also das Problem, daß das memory mapping im gdb im Falle
> blackmagic nicht funktioniert.



GDB 6.8 and higher set any memory area not in the memory map as 
inaccessible. This can be changed to the old behaviour by using the 
following GDB command

set mem inaccessible-by-default off

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Required Field schrieb:
> set mem inaccessible-by-default off

Nur: warum will man das? Nicht zugreifbaren Speicher muss der GDB doch 
auch nicht zugreifen können.

Achso, OK: falls der GDB-Server gar keine memory map liefert, kann es 
natürlich sein, dass der GDB dann auch gar nichts zugreifen möchte …

: Bearbeitet durch Moderator
von Christoph K. (chriskuku)


Lesenswert?

Required Field schrieb:
> Christoph K. schrieb:
>> Bleibt also das Problem, daß das memory mapping im gdb im Falle
>> blackmagic nicht funktioniert.
>
>
>
> GDB 6.8 and higher set any memory area not in the memory map as
> inaccessible. This can be changed to the old behaviour by using the
> following GDB command
>
> set mem inaccessible-by-default off

Danke. Das hat's jetzt erst mal gebracht, was den Memoryzugriff angeht.
Sollte man sich in die .gdbinit schreiben.

von Christoph K. (chriskuku)


Lesenswert?

Habe noch Probleme mit BMP und GDB.

Mich wundert, wieso nach ein paar Steps durch das Programm der 
Reset-Vektor überschrieben wird.
Nach einem load sieht es zunächst gut aus:
1
(gdb) load
2
Loading section .text, size 0x3bdc lma 0x0
3
Start address 0x3a6a, load size 15324
4
Transfer rate: 130 KB/sec, 957 bytes/write.
5
(gdb) x /10x 0
6
0x0:  0x20000330  0x00003a6b  0x000038ab  0x000038ab
7
0x10:  0x000038ab  0x000038ab  0x000038ab  0x00000000
8
0x20:  0x00000000  0x00000000
Nach einigen Steps wird das Flash überschrieben (Programmspeicher):
1
(gdb) s
2
52     ldr r1, =CoreDictionaryAnfang
3
(gdb) x /10x 0
4
0x0:  0x20000330  0x00003a6b  0x000038ab  0x000038ab
5
0x10:  0x000038ab  0x000038ab  0x000038ab  0x00000000
6
0x20:  0x00000000  0x00000000
7
(gdb) s
8
53     str r1, [r0]
9
(gdb) x /10x 0
10
0x0:  0x20000330  0x00003a6b  0x000038ab  0x000038ab
11
0x10:  0x000038ab  0x000038ab  0x000038ab  0x00000000
12
0x20:  0x00000000  0x00000000
13
(gdb) s
14
63    pushdatos
15
(gdb) x /10x 0
16
0x0:  0x20000330  0x00000188  0x000038ab  0x000038ab
17
0x10:  0x000038ab  0x000038ab  0x000038ab  0x00000000
18
0x20:  0x00000000  0x00000000
19
(gdb)

von Christoph K. (chriskuku)


Lesenswert?

Scheint doch an einer Fehlverarbetung im Programm zu liegen. Das 
Programm flasht selbst. Muß den Fehler selber finden.

von Christoph K. (chriskuku)


Lesenswert?

Stelle übrigens fest, daß die gdb/BMP Kombination in eine Situation 
kommen kann, aus der man nicht harauskommt, außer neu zu starten.
Wenn das Programm einen Segmentation Fault gemacht hat (SIGSEGV), kann 
man es nicht mehr neu starten. Interrupt wirkt nicht.
1
(gdb) load
2
Loading section .text, size 0x3bdc lma 0x0
3
Start address 0x3a6a, load size 15324
4
Transfer rate: 131 KB/sec, 957 bytes/write.
5
(gdb) s 53
6
Can't send signals to this remote system.  SIGSEGV not sent.
7
Cannot execute this command while the target is running.
8
Use the "interrupt" command to stop the target
9
and then try again.
10
(gdb) interrupt
11
(gdb) s
12
Cannot execute this command while the selected thread is running.
13
(gdb) r
14
The program being debugged has been started already.
15
Start it from the beginning? (y or n) y
16
Cannot execute this command while the target is running.
17
Use the "interrupt" command to stop the target
18
and then try again.
19
(gdb)


Der Fehler wird hier besprochen, es scheint aber im Moment keine Lösung 
zu geben:
https://github.com/blacksphere/blackmagic/issues/267

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Christoph K. schrieb:
> Wenn das Programm einen Segmentation Fault gemacht hat (SIGSEGV)

Versteh' ich nicht ganz, welches Programm macht das SIGSEGV? Das auf 
dem Controller? Das sollte ja dann eher einen hardfault bringen.

von Christoph K. (chriskuku)


Lesenswert?

Jörg W. schrieb:
> Christoph K. schrieb:
>> Wenn das Programm einen Segmentation Fault gemacht hat (SIGSEGV)
>
> Versteh' ich nicht ganz, welches Programm macht das SIGSEGV? Das auf
> dem Controller? Das sollte ja dann eher einen hardfault bringen.

Das unter gdb zu debuggende Programm. Das Target.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Naja, wie gesagt, das generiert normalerweise einen Hardfault, und der 
übliche Hardfault-Handler ist eine Endlosschleife.

Aber dieses Blackmagic-Dingens scheint sich arg anders zu benehmen als 
andere GDB-Server, habe ich den Eindruck.

von Uwe Bonnes (Gast)


Lesenswert?

Hat irgendjemand eine Bemerkung zu dem Vorschlag in 
https://github.com/blacksphere/blackmagic/issues/267?

@ Jörg: BMP generiert das XML Teil fuer unterstuetzte Devices.

Ansonsten kann man inzwischen BMP auch auf dem PC kompilieren. Dann 
flasht ein "blackmagic <bla.bin>" direkt von der Kommandozeile aus.

Bzgl "(gdb) x/10 0
0x0:  Cannot access memory at address 0x0"

Das ist normales GDB Verhalten solange man nicht "set mem 
inaccessible-by-default off" gesetzt hat.

Und Blackmagic PC kann auch mit STLINK, Jlink, FTDI und CMSIS_DAP 
sprechen.

Und bei Problemberichten die Version des BMPs anzugeben, waere auch 
nicht falsch.

von Christoph K. (chriskuku)


Lesenswert?

BMP-Version:
Firmware 1.7.1-69-gbf548e9

von Christoph K. (chriskuku)


Lesenswert?

Uwe Bonnes schrieb:
> Hat irgendjemand eine Bemerkung zu dem Vorschlag in
> https://github.com/blacksphere/blackmagic/issues/267?
>
> @ Jörg: BMP generiert das XML Teil fuer unterstuetzte Devices.
>

Nur interessehalber: was für ein XML-Teil? Ist das eine Antwort auf eine 
nicht gestellte Frage? :) Oder hab' ich was verpaßt?

Und noch eine Frage zum Verständnis:

Hier ein Auszug vom Start meiner gdb-Session:
1
$ ./GDB_bmp 
2
GNU gdb (GNU Tools for Arm Embedded Processors 8-2018-q4-major) 8.2.50.20181213-git
3
Copyright (C) 2018 Free Software Foundation, Inc.
4
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
5
This is free software: you are free to change and redistribute it.
6
There is NO WARRANTY, to the extent permitted by law.
7
Type "show copying" and "show warranty" for details.
8
This GDB was configured as "--host=x86_64-apple-darwin10 --target=arm-none-eabi".
9
Type "show configuration" for configuration details.
10
For bug reporting instructions, please see:
11
<http://www.gnu.org/software/gdb/bugs/>.
12
Find the GDB manual and other documentation resources online at:
13
    <http://www.gnu.org/software/gdb/documentation/>.
14
15
For help, type "help".
16
Type "apropos word" to search for commands related to "word".
17
Available Targets:
18
No. Att Driver
19
 1      STM32F40x M4
20
0x5bb3b9be in ?? ()
21
(gdb) x /10x 0
22
0x0:  0x0cfeccba  0x45d7ebea  0x98904468  0x5bb3b9bf
23
0x10:  0xb14eaf54  0xf7fbe4bd  0x2f032839  0x7e655535
24
0x20:  0xa95c6a38  0xbfdbaa7c
25
(gdb) load
26
Loading section .text, size 0x3bdc lma 0x0
27
Start address 0x3a6a, load size 15324
28
Transfer rate: 131 KB/sec, 957 bytes/write.
29
(gdb) x /10x 0
30
0x0:  0x20000330  0x00003a6b  0x000038ab  0x000038ab
31
0x10:  0x000038ab  0x000038ab  0x000038ab  0x00000000
32
0x20:  0x00000000  0x00000000
33
(gdb) b Reset
34
Breakpoint 1 at 0x3a6a: file mecrisp-stellaris-stm32-407-DIY-MORE.s, line 72.
35
(gdb) r
36
The program being debugged has been started already.
37
Start it from the beginning? (y or n) y
38
Starting program: /Users/kuku/Downloads/mecrisp-stellaris-2.5.4a/stm32-407-DIY-MORE/firmware.elf 
39
40
Program received signal SIGSEGV, Segmentation fault.
41
0x0000018c in Dictionary_17 ()
42
(gdb)

Warum sagt gdb, daß das Programm schon gestartet sei?

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Christoph K. schrieb:
> Ist das eine Antwort auf eine nicht gestellte Frage?

Nein, es ist eine Antwort auf meine Vermutung, dass die Übermittlung des 
Speicherlayouts möglicherweise nicht unterstützt sein könnte.

@Uwe: ist die Firmware eigentlich Opensource? Hatte nichts gefunden, 
ansonsten hätte ich das selbst nachgesehen.

von Johannes S. (Gast)


Lesenswert?

ja, ist Open Source, der Link wurde ja schon öfter gennant:
https://github.com/blacksphere/blackmagic

Das XML wird aber WIMRE nicht benutzt und bei der initialien Feature 
Verhandlung negativ beantwortert, das wird für die komplexeren 
Prozessoren wie X86/64 gebraucht.

Edit:
stimmt nicht ganz,
https://github.com/blacksphere/blackmagic/blob/09c000eca8341b1b5ee4706befc2af02591323be/src/gdb_main.c#L381-L408
und dann ist es target abhängig:
https://github.com/blacksphere/blackmagichttps://github.com/blacksphere/blackmagic/blob/09c000eca8341b1b5ee4706befc2af02591323be/src/target/cortexm.c#L474
da müsste man es weiterverfolgen.

von Christoph K. (chriskuku)


Lesenswert?

@Johannes: der zweite Link gibt ein „Not Found“.

Er sähe besser so aus:

https://github.com/blacksphere/blackmagic/blob/09c000eca8341b1b5ee4706befc2af02591323be/src/target/cortexm.c#L474

: Bearbeitet durch User
von Christoph K. (chriskuku)


Lesenswert?

Wollte mal versuchen, binutils-gdb mit dem vorgeschlagenen Patch zu 
kompilieren.

Auf

https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm

find ich auf der Mitte der Seite:

GDB

You can find the sources to Arm Embedded Binutils at 
git://sourceware.org/git/binutils-gdb.git. All embedded branches are at 
*users/ARM/embedded-gdb-[version]-branch*. You can contribute in the 
same way that you contrinbute to GCC.

Weiß jemand, wo genau ich diese branches finde? Ich hatte mal ein git 
clone gemacht, aber damit kommt nichts von users/ARM mit herunter.

: Bearbeitet durch User
von Uwe Bonnes (Gast)


Lesenswert?

Johannes S. schrieb:
...
> Das XML wird aber WIMRE nicht benutzt und bei der initialien Feature
> Verhandlung negativ beantwortert, das wird für die komplexeren
> Prozessoren wie X86/64 gebraucht.
>
>
Mach mal in gdb ein "info mem", da wird der xml String gebraucht. 
Ausserdem mach gdn bei "load" etwas anders, je nachdem ob im Flash oder 
Ram geschriebenwerden soll.

PS: In gdn fehlt das Gegenstueck zu "dump" um eine bin File wieder 
zurueck auf das Device zu bringen.

von Uwe Bonnes (Gast)


Lesenswert?

Christoph K. schrieb:

> Warum sagt gdb, daß das Programm schon gestartet sei?

Es fehlt das "att 1". Nach einem Kaltstart waere gar nichts gegangen, 
bei Warmstart bleiben einige Register verbogen zurueck, so  dass manches 
ohne vorheriges Attach geht.

von Christoph K. (chriskuku)


Lesenswert?

Uwe Bonnes schrieb:
> Christoph K. schrieb:
>
>> Warum sagt gdb, daß das Programm schon gestartet sei?
>
> Es fehlt das "att 1". Nach einem Kaltstart waere gar nichts gegangen,
> bei Warmstart bleiben einige Register verbogen zurueck, so  dass manches
> ohne vorheriges Attach geht.

Eigentlich habe ich es in .gdbinit:
1
$ cat .gdbinit
2
file firmware.elf
3
set mem inaccessible-by-default off
4
tar extended-remote /dev/cu.usbmodemC2D498011
5
mon s
6
att 1
7
8
$ ./GDB_bmp 
9
GNU gdb (GNU Tools for Arm Embedded Processors 8-2018-q4-major) 8.2.50.20181213-git
10
Copyright (C) 2018 Free Software Foundation, Inc.
11
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
12
This is free software: you are free to change and redistribute it.
13
There is NO WARRANTY, to the extent permitted by law.
14
Type "show copying" and "show warranty" for details.
15
This GDB was configured as "--host=x86_64-apple-darwin10 --target=arm-none-eabi".
16
Type "show configuration" for configuration details.
17
For bug reporting instructions, please see:
18
<http://www.gnu.org/software/gdb/bugs/>.
19
Find the GDB manual and other documentation resources online at:
20
    <http://www.gnu.org/software/gdb/documentation/>.
21
22
For help, type "help".
23
Type "apropos word" to search for commands related to "word".
24
Available Targets:
25
No. Att Driver
26
 1      STM32F40x M4
27
Reset () at myfirst.s:134
28
134  1: movs r0,r0
29
(gdb) att 1
30
A program is being debugged already.  Kill it? (y or n)

Bleibt also die Frage, warum nach:
1
(gdb) att 1
2
Attaching to program: /Users/kuku/myfirst/firmware.elf, Remote target
3
Reset () at myfirst.s:134
4
134  1: movs r0,r0
5
(gdb) r
6
The program being debugged has been started already.
7
Start it from the beginning? (y or n)

die Meldung kommt, daß das zu debuggende Programm schon gestartet sei.

: Bearbeitet durch User
von Uwe Bonnes (Gast)


Lesenswert?

Fuer welche Hardware ist das Programm. Kannst Du mir das elf File oder 
besser den Sourcebaum mit dem Elf File zukommen lassen? Vielleicht als 
issue in https://github.com/blacksphere/blackmagic/issues oder dropbox?
Und/oder kannst Du den Vorschlag in 
https://github.com/blacksphere/blackmagic/issues/267 testen?

von Christoph K. (chriskuku)


Lesenswert?

Uwe Bonnes schrieb:
> Fuer welche Hardware ist das Programm. Kannst Du mir das elf File oder
> besser den Sourcebaum mit dem Elf File zukommen lassen? Vielleicht als
> issue in https://github.com/blacksphere/blackmagic/issues oder dropbox?
> Und/oder kannst Du den Vorschlag in
> https://github.com/blacksphere/blackmagic/issues/267 testen?

Letzteres habe ich versucht bzw. bin dabei. Im Moment noch gcc Fehler 
bei Kompilation. Hatte den Sourcetree auf gitlab ausgemacht.

Meine Target Source schicke ich heute abend. Bin im Moment auf Achse.

: Bearbeitet durch User
von Uwe Bonnes (Gast)


Lesenswert?

Keine Eile, Und kein Versprechen meinerseits...

von Christoph K. (chriskuku)


Angehängte Dateien:

Lesenswert?

Uwe Bonnes schrieb:
> Keine Eile, Und kein Versprechen meinerseits...

Hier ist das eingedampfte Projekt.

README:
make clean all

./GDB_bmp


1. Warum sagt gdb "A program is being debugged already"?

2. Warum stoppt das Target nicht auf dem gesetzten Breakpoint?

3. Warum sagt es bei r(un):

The program being debugged has been started already.
Start it from the beginning? (y or n) y

4. Warum sehe ich ab 0x400 nach meinem Programm nicht 0xfffffff 
durchweg,
   wenn ich vorher ein mon erase_mass gemacht habe. Irgendwo muß ich
   doch sehen, daß der Flash gelöscht ist.

   Auch hinter 0x08000000 sehe ich keine FFFF.

Grüße
Christoph


Anm.: aus Versehen ist der .gdbinit als .gdbinit.gz herübergekommen. Den 
bitte noch entpacken.

: Bearbeitet durch User
von Christoph K. (chriskuku)


Lesenswert?

Noch eine Bemerkung zum blackmagic:

den Tree brauchst Du ja wohl nicht. Ich hatte ja die Version gepostet.
Gebaut habe ich blackmagic

mit

make PROBE_HOST=swlink

entsprechend der Anleitung in:

https://buger.dread.cz/black-magic-probe-bmp-on-bluepill-stm32f103c8-minimum-system-development-board.html


und dann mit

stm32flash

in das Blue Pill Board geflasht.

: Bearbeitet durch User
von Johannes S. (Gast)


Lesenswert?

Christoph K. schrieb:
> 3. Warum sagt es bei r(un):
>
> The program being debugged has been started already.
> Start it from the beginning? (y or n) y

Mit 'attach' hängt sich gdb an einen laufenden Prozess, da darf er also 
annehmen das das Target schon läuft und die Frage beim run Befehl macht 
Sinn.
Hier gibt es schon wenige die den Debugger nutzen und sicher noch viel 
weniger die das über die Shell machen. Eine IDE nutzt den mi command 
interpreter vom gdb und diese Fragen stellen sich gar nicht.
Das der Breakpoint nicht getroffen wird könnte daran liegen das der Code 
wegoptimiert wurde und auf die entsprechende Sourcecodezeile kein BP 
gesetzt werden kann (falls es um Sourcecode Debugging ging).

von Christoph K. (chriskuku)


Lesenswert?

Johannes S. schrieb:
> Christoph K. schrieb:
>> 3. Warum sagt es bei r(un):
>>
>> The program being debugged has been started already.
>> Start it from the beginning? (y or n) y
>
> Mit 'attach' hängt sich gdb an einen laufenden Prozess, da darf er also
> annehmen das das Target schon läuft und die Frage beim run Befehl macht
> Sinn.

Das Target ist ja noch nicht mal geladen zu diesem Zeitpunkt. Also meine 
ich schon, daß diese GDB Kombination mit dem Server
diesen Zustand irgendwie berücksichten sollte. Aber gut, wie hieß es 
hier letztens ja, einem geschenkten...

> Hier gibt es schon wenige die den Debugger nutzen und sicher noch viel
> weniger die das über die Shell machen. Eine IDE nutzt den mi command
> interpreter vom gdb und diese Fragen stellen sich gar nicht.
> Das der Breakpoint nicht getroffen wird könnte daran liegen das der Code
> wegoptimiert wurde und auf die entsprechende Sourcecodezeile kein BP
> gesetzt werden kann (falls es um Sourcecode Debugging ging).

Ja, Assembler-Source code Debugging.
Wegoptimiert? Vom Programmierer selbst geschriebener Assemblersourcecode 
wird nicht "wegoptimiert". Das wäre ja noch schöner :)


Nachtrag:

Habe jetzt folgende Vorgehensweise als "trittfest" festgestellt:
1
.gdbinit:
2
$ cat .gdbinit
3
file firmware.elf
4
set mem inaccessible-by-default off
5
tar extended-remote /dev/cu.usbmodemC2D498011
6
mon s
7
att 1
8
$ 
9
$ ./GDB_bmp 
10
GNU gdb (GNU Tools for Arm Embedded Processors 8-2018-q4-major) 8.2.50.20181213-git
11
Copyright (C) 2018 Free Software Foundation, Inc.
12
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
13
This is free software: you are free to change and redistribute it.
14
There is NO WARRANTY, to the extent permitted by law.
15
Type "show copying" and "show warranty" for details.
16
This GDB was configured as "--host=x86_64-apple-darwin10 --target=arm-none-eabi".
17
Type "show configuration" for configuration details.
18
For bug reporting instructions, please see:
19
<http://www.gnu.org/software/gdb/bugs/>.
20
Find the GDB manual and other documentation resources online at:
21
    <http://www.gnu.org/software/gdb/documentation/>.
22
23
For help, type "help".
24
Type "apropos word" to search for commands related to "word".
25
Available Targets:
26
No. Att Driver
27
 1      STM32F40x M4
28
dictionarynext () at ../common/compiler-flash.s:1008
29
1008      ldrb r0, [r1, #6]
30
(gdb) x /10x 0
31
0x0:  0x20000330  0x00000188  0x000038ab  0x000038ab
32
0x10:  0x000038ab  0x000038ab  0x000038ab  0x00000000
33
0x20:  0x00000000  0x00000000
34
35
#Zu dem Zeitpunkt ist das, was auf 0 ff. steht, garbage. Insbesondere der
36
#Resetvektor (0x188) wird immer dahin geschrieben, wenn das Programm
37
# crasht (SIGSEGV).
38
39
(gdb) load
40
Loading section .text, size 0x3bdc lma 0x0
41
Start address 0x3a6a, load size 15324
42
Transfer rate: 130 KB/sec, 957 bytes/write.
43
(gdb) x /10x 0
44
0x0:  0x20000330  0x00003a6b  0x000038ab  0x000038ab
45
0x10:  0x000038ab  0x000038ab  0x000038ab  0x00000000
46
0x20:  0x00000000  0x00000000
47
(gdb) 
48
# jetzt steht wieder der richtige Resetvektor da
49
(gdb) b Reset
50
Breakpoint 1 at 0x3a6a: file mecrisp-stellaris-stm32-407-DIY-MORE.s, line 72.
51
(gdb) s
52
53
Breakpoint 1, Reset () at mecrisp-stellaris-stm32-407-DIY-MORE.s:72
54
72     bl uart_init
55
(gdb) 
56
uart_init () at terminal.s:85
57
85    push {lr}
58
(gdb) 
59
87    bl Setup_Clocks
60
(gdb) 
61
Setup_Clocks () at terminal.s:102
62
102          ldr r1, = RCC_CR
63
(gdb) 
64
103          mov r0, #HSEON
65
(gdb) 
66
104          str r0, [r1]            @ turn on the external clock
67
(gdb) 
68
awaitHSE () at terminal.s:107
69
107          ldr r0, [r1]

So scheint erst mal step-Betrieb möglich.

Wenn ich aber ein
r(un)
absetze, wird der Breakpoint nicht getroffen und das Programm macht ein 
SIGSEGV, wonach dann nur noch Neustart des Targets und GDB möglich sind.


(gdb)
108          ands r0, #HSERDY
(gdb)

: Bearbeitet durch User
von Christoph K. (chriskuku)


Lesenswert?

Merkwürdiges Problem mit gdb. Ich habe das Programm, das nicht läuft, in 
das stm32-407-DIYMORE Board geflasht.
Ich steppe durch eine Programmpassage und untersuche immer, was im 
Vektorbereich erscheint. Der sollte ja eigentlich nicht verändert 
werden, da er ja im Flash liegt. Jetzt sieht es aber so aus, als 
schreibe das Programm dorthin, obwohl es eigentlich nach 0x20000004 
schreiben soll.
Große Verwunderung:
1
(gdb) x /10x 0
2
0x0:  0x20000330  0x00003a6b  0x000038ab  0x000038ab
3
0x10:  0x000038ab  0x000038ab  0x000038ab  0x00000000
4
0x20:  0x00000000  0x00000000
5
(gdb) s
6
45     ldr r0, =Dictionarypointer
7
(gdb) 
8
46     ldr r1, =RamDictionaryAnfang
9
(gdb) i r
10
r0             0x20000000          536870912
11
r1             0x40021014          1073877012
12
r2             0x0                 0
13
r3             0x0                 0
14
r4             0x0                 0
15
r5             0x0                 0
16
r6             0x2a                42
17
r7             0x20000230          536871472
18
r8             0x0                 0
19
r9             0x0                 0
20
r10            0x0                 0
21
r11            0x0                 0
22
r12            0x0                 0
23
sp             0x20000330          0x20000330
24
lr             0x1435              0x1435 <uart_init+10>
25
pc             0x3a7a              0x3a7a <Reset+16>
26
xpsr           0x1000000           16777216
27
fpscr          0x0                 0
28
msp            0x20000330          0x20000330
29
psp            0x0                 0x0
30
primask        0x0                 0 '\000'
31
basepri        0x0                 0 '\000'
32
faultmask      0x0                 0 '\000'
33
control        0x0                 0 '\000'
34
(gdb) s
35
47     str r1, [r0]
36
(gdb) x /10x 0
37
0x0:  0x20000330  0x00003a6b  0x000038ab  0x000038ab
38
0x10:  0x000038ab  0x000038ab  0x000038ab  0x00000000
39
0x20:  0x00000000  0x00000000
40
(gdb) i r
41
r0             0x20000000          536870912
42
r1             0x20000330          536871728
43
r2             0x0                 0
44
r3             0x0                 0
45
r4             0x0                 0
46
r5             0x0                 0
47
r6             0x2a                42
48
r7             0x20000230          536871472
49
r8             0x0                 0
50
r9             0x0                 0
51
r10            0x0                 0
52
r11            0x0                 0
53
r12            0x0                 0
54
sp             0x20000330          0x20000330
55
lr             0x1435              0x1435 <uart_init+10>
56
pc             0x3a7c              0x3a7c <Reset+18>
57
xpsr           0x1000000           16777216
58
fpscr          0x0                 0
59
msp            0x20000330          0x20000330
60
psp            0x0                 0x0
61
primask        0x0                 0 '\000'
62
basepri        0x0                 0 '\000'
63
faultmask      0x0                 0 '\000'
64
control        0x0                 0 '\000'
65
(gdb) s
66
51     ldr r0, =Fadenende
67
(gdb) x /10x 0x20000000
68
0x20000000:  0x20000330  0x00003a6b  0x000038ab  0x000038ab
69
0x20000010:  0x000038ab  0x000038ab  0x000038ab  0x00000000
70
0x20000020:  0x00000000  0x00000000
71
(gdb) s
72
52     ldr r1, =CoreDictionaryAnfang
73
(gdb) x /10x 0
74
0x0:  0x20000330  0x00003a6b  0x000038ab  0x000038ab
75
0x10:  0x000038ab  0x000038ab  0x000038ab  0x00000000
76
0x20:  0x00000000  0x00000000
77
(gdb) i r
78
r0             0x20000004          536870916
79
r1             0x20000330          536871728
80
r2             0x0                 0
81
r3             0x0                 0
82
r4             0x0                 0
83
r5             0x0                 0
84
r6             0x2a                42
85
r7             0x20000230          536871472
86
r8             0x0                 0
87
r9             0x0                 0
88
r10            0x0                 0
89
r11            0x0                 0
90
r12            0x0                 0
91
sp             0x20000330          0x20000330
92
lr             0x1435              0x1435 <uart_init+10>
93
pc             0x3a80              0x3a80 <Reset+22>
94
xpsr           0x1000000           16777216
95
fpscr          0x0                 0
96
msp            0x20000330          0x20000330
97
psp            0x0                 0x0
98
primask        0x0                 0 '\000'
99
basepri        0x0                 0 '\000'
100
faultmask      0x0                 0 '\000'
101
control        0x0                 0 '\000'
102
(gdb) s
103
53     str r1, [r0]
104
(gdb) i r
105
r0             0x20000004          536870916
106
r1             0x188               392
107
r2             0x0                 0
108
r3             0x0                 0
109
r4             0x0                 0
110
r5             0x0                 0
111
r6             0x2a                42
112
r7             0x20000230          536871472
113
r8             0x0                 0
114
r9             0x0                 0
115
r10            0x0                 0
116
r11            0x0                 0
117
r12            0x0                 0
118
sp             0x20000330          0x20000330
119
lr             0x1435              0x1435 <uart_init+10>
120
pc             0x3a82              0x3a82 <Reset+24>
121
xpsr           0x1000000           16777216
122
fpscr          0x0                 0
123
msp            0x20000330          0x20000330
124
psp            0x0                 0x0
125
primask        0x0                 0 '\000'
126
basepri        0x0                 0 '\000'
127
faultmask      0x0                 0 '\000'
128
control        0x0                 0 '\000'
129
(gdb) x /10x 0
130
0x0:  0x20000330  0x00003a6b  0x000038ab  0x000038ab
131
0x10:  0x000038ab  0x000038ab  0x000038ab  0x00000000
132
0x20:  0x00000000  0x00000000
133
(gdb) s
134
63    pushdatos
135
(gdb) x /10x 0
136
0x0:  0x20000330  0x00000188  0x000038ab  0x000038ab
137
0x10:  0x000038ab  0x000038ab  0x000038ab  0x00000000
138
0x20:  0x00000000  0x00000000
139
(gdb)

Eigentlich sollte ja die 0x188 nach [r0], also 0x20000004 geschrieben 
werden. Es steht aber dann in 0x00000004 (!?).

Wie das? Denkfehler meinerseits? Fehler im GDB/BMP?

: Bearbeitet durch User
von Christoph K. (chriskuku)


Angehängte Dateien:

Lesenswert?

Ich will das Problem noch etwas vereinfachter darstellen:

simple.s:
1
$ cat .gdbinit
2
file firmware.elf
3
set mem inaccessible-by-default off
4
tar extended-remote /dev/cu.usbmodemC2D498011
5
mon s
6
att 1
7
8
$ 
9
$ ./GDB
10
GNU gdb (GNU Tools for Arm Embedded Processors 8-2018-q4-major) 8.2.50.20181213-git
11
Copyright (C) 2018 Free Software Foundation, Inc.
12
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
13
This is free software: you are free to change and redistribute it.
14
There is NO WARRANTY, to the extent permitted by law.
15
Type "show copying" and "show warranty" for details.
16
This GDB was configured as "--host=x86_64-apple-darwin10 --target=arm-none-eabi".
17
Type "show configuration" for configuration details.
18
For bug reporting instructions, please see:
19
<http://www.gnu.org/software/gdb/bugs/>.
20
Find the GDB manual and other documentation resources online at:
21
    <http://www.gnu.org/software/gdb/documentation/>.
22
23
For help, type "help".
24
Type "apropos word" to search for commands related to "word".
25
Available Targets:
26
No. Att Driver
27
 1      STM32F40x M4
28
0x0000044c in Loop () at simple.s:37
29
37  Loop:    b Loop
30
(gdb) load
31
Loading section .text, size 0x450 lma 0x0
32
Start address 0x440, load size 1104
33
Transfer rate: 119 KB/sec, 552 bytes/write.
34
(gdb) x /10x 0
35
0x0 <Bottom>:  0x40000000  0x00000440  0x0000044e  0x0000044e
36
0x10 <Bottom+16>:  0x0000044e  0x0000044e  0x0000044e  0x00000000
37
0x20 <Bottom+32>:  0x00000000  0x00000000
38
(gdb) 
39
(gdb) r
40
The program being debugged has been started already.
41
Start it from the beginning? (y or n) y
42
Starting program: /Users/kuku/myfirst/firmware.elf 
43
^C
44
Program received signal SIGINT, Interrupt.
45
Loop () at simple.s:37
46
37  Loop:    b Loop
47
(gdb) x /10x 0
48
0x0 <Bottom>:  0x00000188  0x00000440  0x0000044e  0x0000044e
49
0x10 <Bottom+16>:  0x0000044e  0x0000044e  0x0000044e  0x00000000
50
0x20 <Bottom+32>:  0x00000000  0x00000000
51
(gdb)

Warum schreibt das Programm (scheinbar) in den Flashbereich, also das, 
was aus 0x08000000 in den Programspace gemappt wird?

von Christoph K. (chriskuku)


Lesenswert?

Ich brauche noch mal einen "reload", was flashen mit BMP angeht.
Hatte das Projekt einige Monate nicht angerührt und ich versuche jetzt, 
zu rekonstruieren, was ich damals gemacht habe.

Mein Szenario ist momentan:

STM32F407-DISC1 board mit dem on board STLINK-V2 über USB-Kabel an Mac 
angeschlossen. Der STLINK ist so gejumpert, daß er nicht mit der 
Discovery MCU verbindet, also beide Jumper von CN3 off.

Target ist ein STM32F407 DIYMORE breakout board, das ich über die 
SWD-Leitungen (SCLK, SWDIO, RESET - pins 2-4-6 am SWD Interface) 
angeschlossen habe.

Wenn ich mich richtig erinnere, konnte man blackmagic als hosted server 
kompilieren, so das es ein USB-serial device * zur Verfügung stellt, 
über das GDB verbindet. War das richtig so? Und zuletzt funktionierte 
etwas nicht mit dem blackmagic (build?). Da würde ich gerne wieder 
aufsetzen.

*) Korrektur: nicht USB-Device, sondern einen tcp-port

: Bearbeitet durch User
von Christoph K. (chriskuku)


Lesenswert?

Das kompilierte blackmagic macht leider nichts. Auch wenn ich die 
Compiler-Fehler zu Warnungen umwidme, tut das blackmagic Binary nichts. 
Es startet und macht leise weinend einen exit. Auch Verbositätserhöhung 
führt zu nichts.

Es wird auch gemeckert, daß ein hidapi-libusb nicht im pkg-config PATH 
gefunden wurde, was das Linken zwar nicht zu stören scheint, aber 
letztlich zu dem unbrauchbaren Binary führt.

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

make PROBE_HOST=hosted clean; make PROBE_HOST=hosted HOSTED_BMP_ONLY=1
braucht weniger Bibliotheken. Und fuer hosted muss die BMP Firmware 
einigermassen aktuell sein.  Fuer BMP/Stlink muss man aber "make 
PROBE_HOST=hosted" kompilieren. Auch die ST/Stlink-Firmware muss 
aktuelle sein.

: Bearbeitet durch User
von Christoph K. (chriskuku)


Lesenswert?

Christoph K. schrieb:
> ...
> Target ist ein STM32F407 DIYMORE breakout board, das ich über die
> SWD-Leitungen (SCLK, SWDIO, RESET - pins 2-4-6 am SWD Interface)
> angeschlossen habe.
>
>> ...
>


Ist das eigentlich richtig? 2-4-6? Oder muß das nicht 2-4-5 sein ?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.