问题描述
我正在尝试使用 gdb
我正在使用 jlinkgdbserver
在目标系统 (cortex-m7) 上设置 gdbserver。我有一个精灵准备调试。
第一次,我可以用下面的方式调试
> arm-none-eabi-gdb flash_program.elf
(gdb)> target remote localhost:2331 # connect to gdb server on target
(gdb)> load # since it is a flash program,jlink will flash the program
# target is reset to elf entry point
(gdb)> .... (debugging begins)
然而,当调试到某个地方时,我想再次从入口点调试,我想出的方法是再次闪烁
(gdb)> Ctrl+D # disconnect the gdbserver
> arm-none-eabi-gdb flash_program.elf
(gdb)> target remote localhost:2331
(gdb)> load
(gdb)> .... (debugging from start again)
所以这看起来有点多余,而且它一次又一次地擦除和编程同一个闪存区域,我担心我最终会通过调试损坏存储。
flash 程序已经烧录到介质中,我只想让目标重新设置自己并再次从入口点运行。但我尝试了 monitor reset
和 run
之类的东西。但目标M7都无法从头开始。
还有其他我可以尝试的 gdb 命令吗?
解决方法
我使用 STM32F103C8T6
来提供答案,但您只需将其 ROM 基地址 (0x20000000
) 替换为您的 Cortex-M7 使用的地址:就我而言,我加载了来自 0x20000000
的堆栈指针的初始值,以及来自 0x20000000+4
的程序计数器的初始值。
要调试的程序是 stm32f103c8t6.elf
,已经刷入并包含调试符号。
arm-none-eabi-gdb
target remote localhost:2331
0x20000480 in ?? ()
(gdb) monitor halt
(gdb) monitor reset 0
Resets core & peripherals via SYSRESETREQ & VECTRESET bit.
(gdb) monitor reset 1
Resets the core only,not peripherals.
(gdb) monitor reset 2
Resets core & peripherals using RESET pin.
(gdb) symbol-file stm32f103c8t6.elf
Reading symbols from stm32f103c8t6.elf...
(gdb) set $sp = *0x20000000
(gdb) set $pc = *0x20000004
(gdb) stepi
0x200003c2 121 {
(gdb)
0x200003c4 121 {
(gdb) stepi
122 SystemInit(); /* CMSIS System Initialization */
(gdb)
SystemInit () at /opt/arm/ARM.CMSIS.5.6.0//Device/ARM/ARMCM3/Source/system_ARMCM3.c:61
61 {
(gdb)
根据您要使用的重置策略类型,您可能需要在 monitor reset
命令中明确它:
如 Segger 文档和 this great article 中所述,您可以使用策略编号 0、1 或 2:
# Normal
monitor reset
monitor reset 0
# Core
monitor reset 1
# ResetPin
monitor reset 2
我的理解是,能否使用策略 #2 取决于您的 RESET 引脚的接线方式,即它是否在您的电路板上被下拉。
免责声明:我是一名软件人员,所有与硬件相关问题的解释错误都是我的......
,gdb 命令load 会刷写镜像,前提是你没有专门设置链接地址。 你有两种生存选择:
- 设置链接地址/调整链接脚本,使程序完全在RAM中。或者
- 保持地址不变,但每次代码更改和编译后,只使用加载一次(使闪存被编程),然后使用符号文件 命令只加载符号。