4

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

从那以后,使用 GDB 进行调试就一直不起作用。据我了解,当可执行文件在 Flash 中时,只能使用硬件断点(与软件断点相反),我有六个硬件断点。但是,当只设置一个硬件断点时,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.

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

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

4

1 回答 1

4

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

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

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

  3. 单步执行整个程序。这个不算数,因为它非常慢。

听起来您的调试器似乎只使用方法#2(“软件断点”)。这种方法的问题是它要求程序是可写的——而且闪存不能一次写一条指令,所以这种技术行不通。

于 2012-07-04T01:44:45.107 回答