Atmel Studio:数据断点究竟是如何触发的?

Atmel Studio: How exacly do data breakpoints trigger?

好的伙计们。我在 Atmel studio 中设置了一个数据断点(使用 ICEmk2-JTag 调试器),尽管地址的值已更改,但它不会被击中。 (我用以下断点检查了它) 这是为什么?

数据断点的全部目的是检测地址值的变化,还是我误解了什么?

更具体地说:我有一个指向一个值的指针 A。但是指针 A 被我试图追捕的错误更改了(不是它指向的值!)。 因此,我创建了一个指向指针 A 存储地址的指针 B,并在指针 B 上设置了一个数据断点。 这是初始化:

#define lastCMDRingBufferSIZE 255

volatile uint8_t lastCMDRingbuffer[lastCMDRingBufferSIZE]; //
volatile uint8_t*lastCMDRingstartPtr = lastCMDRingbuffer; // This is PtrA
volatile uint32_t*ptrToPtr = &lastCMDRingstartPtr; // PtrB

或者换一种说法;如果出现以下情况,是否触发数据断点:

  1. 地址内容写入数组溢出?
  2. 地址的内容被解释为更大的数据结构的一部分,该数据结构以某种方式由流氓指针写入? (例如:取消引用并写入 64 位指针,结果覆盖 32 位整数)

非常感谢您的怀疑和建议:)

您没有以正确的方式解决(双关语不是故意的)这个问题。如果指针A被破坏,数据断点需要直接设置在&A;创建辅助指针不会做任何有用的事情,除非您可以设置 A != B.

的条件断点

Is a databreakpoint triggered if:

  1. the content of the address is written by a array overflow? the content of the address is interpreted as part of a larger data structure that
  2. is somehow written by a rogue pointer? (expl: a 64 bit pointer is dereferenced and written to, as a result a 32bit integer gets overwritten)

当断点地址处的值改变时触发——就这么简单;片上调试硬件没有语言结构的概念;因此,您需要观看的地址是 &A 而不是 AB.

在您实际代码的上下文中,如果 lastCMDRingstartPtr 被修改,ptrToPtr 也不会改变。只需输入 &lastCMDRingstartPtr 作为地址;那么当 lastCMDRingstartPtr 的值改变时,你会得到休息。

我使用的支持数据访问中断的调试硬件没有像我认为大多数人期望的那样实现。硬件不会监视地址处的内存并在它发生变化时发出断点,它会监视 CPU 的 read/write 总线并在给定地址(或地址范围)发生访问时中断) 和正确的宽度。

最终结果是您可以进行一些不被硬件捕获的活动。 DMA 访问内存是一个您根本无法捕获的大问题(除非您的 SRAM/DRAM 接口有能力发出这样的错误)。此外,如果您在未配置调试硬件的模式下访问地址(即,在查找字写入时进行字节写入——如果您有一个非常天真的 memset/memcpy 进行字节访问)

我的猜测是您正在对指针之前声明的数组进行一些字节访问,并通过溢出数组来踩踏指针。即使您在指针上设置了字访问硬件断点,它也不会被捕获,因为您正在进行字节访问。