对于ARM debugger工具,常用的有两种breakpoint. Hardware vs Software 类型。
ARM 文档给出的相关定义如下。
Hardware breakpoints:
1) 依赖于目标processor实现, 大多数ARM processor都包含了特定的硬件资源,例如
ARM EmbeddedICE 硬件逻辑, 来匹配特定的硬件事件。
调试时使用的调试器可以配置这些硬件资源来实现指令和数据断点。
数据断点有时也被称作为 watchpoint.
2) 哪些硬件资源有效存在,依赖于所使用的处理器。 具体需要参考处理器手册。
3) 硬件断点能够提供额外的匹配能力。 比如可以匹配某个外部信号,
比如区分具有特定权限和非特定权限的存取访问等。 设置地址/数据断点对话框列出了目标硬件的能力范围。
4) 硬件指令断点并不需要内存中的指令发生改变。
这意味着硬件断点可以用来调试flash 和 ROM 中的代码, 并且也能被用于调试可自我修改的代码。
Software Instruction Breakpoint
1) 如果处理器不支持硬件指令断点, 或者你已经用完了有效的硬件断点资源,
这时你可以使用软件指令断点。
2) 软件指令断点修改内存中的指令以创造一个特殊的值, 该值被执行的时候使得处理器进入调试模式。
写入内存中的特殊值取决于所使用的处理器类型。 对于ARM处理器, 根据体系结构和处理器版本,
下列机制之一被使用:
a ) Undefined instruction 被写入内存中, 并且一个硬件断点资源被用来监测该指令的执行。
当硬件断点单元监测到该 undefined instruction 进入执行流水线阶段, 则处理器进入调试模式。
b ) 一条 ARMv5 BKPT 指令被写入内存, 并且一个硬件断点资源被用来监测该指令的执行。
当硬件断点单元监测到该 BKPT 指令进入执行流水线阶段,则处理器进入调试模式。
c ) 一条 ARMv5 BKPT指令被写入内存。 当该条指令被执行的时候, 处理器自动进入调试模式。
3) 当一个硬件断点单元被用于监测软件指令断点时, 无论有多少个软件指令断点被设置,
仅仅只有单个的硬件断点资源被使用。 如果你不能成功设置软件指令断点, 你可能需要尝试
首先释放一个硬件断点资源出来。
4) 软件断点不能用于调试flash 或者 ROM 代码。 并且在可自我修改的代码中不可靠。
注意
1) 当浏览内存或者汇编代码时, 调试目标硬件给出的是内存实际值。
2) 在运行之前, 任何软件断点都已经被写入了内存。
3) 当处理器停机的时候, 软件断点会从内存中被移除。 在许多处理器中,不能在运行时访问内存。
这意味着如果你在目标硬件运行时,断开了调试器和被调试处理器间的连接, 那些断点将被保留在内存中!
如果处理器随后执行其中的某个断点指令,则(具体依赖于体系结构)处理器要么停在软件断点处;
要么导致处理器产生一个未定义异常。