从闪存启动时断点不起作用

Ran*_*lue 4 gdb breakpoints stm32

过去,我一直在调试 Cortex M3 (STM32F2) 内部 SRAM 中加载的可执行文件,没有出现任何问题。我最近将可执行文件加载到 Flash(由于大小问题)。

从那时起,使用 GDB 进行调试就不再起作用了。据我了解,当可执行文件位于闪存中时,只能使用硬件断点(与软件断点相反),并且我有六个硬件断点。然而,当仅设置一个硬件断点时,GDB 会产生一条错误消息:

(gdb) break main
Breakpoint 1 at 0x800019a: file src/main.c, line 88.
(gdb) c
Continuing.
Note: automatically using hardware breakpoints for read-only addresses.
(gdb) Warning:
Cannot insert hardware breakpoint 1.
Could not insert hardware breakpoints:
You may have requested too many hardware breakpoints/watchpoints.
Run Code Online (Sandbox Code Playgroud)

可能出了什么问题?我的硬件断点是否在后台进行?

注意:我使用 OpenOCD 通过 JTAG 加载可执行文件。

小智 5

因此,基本上有两种方法(加上一种非常糟糕的方法)可以在任何给定的调试器/平台组合上实现断点:

  1. 使用一些硬件功能(“硬件断点”)使处理器在到达特定地址时陷入困境。如果可用的话,这通常仅限于几个断点。

  2. 对于要设置的每个断点,将断点处的指令替换为某种“陷阱”指令(即,将中断调试器的指令)。当其中一个断点被击中时,将原始指令交换回原指令并单步执行一次以使其运行。

  3. 单步执行整个程序。这个其实不算数,因为它慢得可怕。

听起来好像你的调试器只使用方法#2(“软件断点”)。这种方法的问题是它要求程序可写——而闪存不能一次写入一条指令,因此这种技术不起作用。