Gdb 从闪存启动时断点不工作

Gdb 从闪存启动时断点不工作,gdb,breakpoints,stm32,Gdb,Breakpoints,Stm32,过去,我一直在调试Cortex M3(STM32F2)内部SRAM中加载的可执行文件,没有任何问题。我最近一直在将可执行文件加载到Flash(因为大小问题) 从那以后,用GDB进行调试就一直不起作用。据我所知,当可执行文件在Flash中时,只能使用硬件断点(与软件断点相反),我有六个硬件断点。但是,仅设置一个硬件断点时,GDB会生成错误消息: (gdb) break main Breakpoint 1 at 0x800019a: file src/main.c, line 88. (gdb) c

过去,我一直在调试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加载可执行文件。

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

  • 使用某些硬件功能(“硬件断点”)使处理器在命中特定地址时陷入陷阱。这通常仅限于几个断点(如果有的话)

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

  • 一步一步地完成整个计划。这个不算,因为它慢得可怕


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

    你有没有试过用hbreak创建断点?@ams:有,我试过。不起作用。
    维护信息断点
    说什么?@ams:它说“没有断点或观察点”。那应该排除隐藏的背景断点。