好的人。我在Atmel studio中设置了一个数据断点(使用ICEmk2-JTag调试器),虽然地址的值发生了变化,但它不会被命中。 (我用以下断点检查了它) 这是为什么?
数据断点的全部目的是检测地址值的变化,还是我误解了什么?
更具体一点:我有一个指向值的指针A.但是指针A被我试图追捕的错误改变了(不是它指向的值!)。 因此,我创建了一个指针B,指向存储指针A的地址,并在指针B上设置数据断点。 这是初始化:
#define lastCMDRingBufferSIZE 255
volatile uint8_t lastCMDRingbuffer[lastCMDRingBufferSIZE]; //
volatile uint8_t*lastCMDRingstartPtr = lastCMDRingbuffer; // This is PtrA
volatile uint32_t*ptrToPtr = &lastCMDRingstartPtr; // PtrB
或另外一种方式;在以下情况下是否触发了数据密码点:
您的暂停和建议非常感谢:)
答案 0 :(得分:1)
你没有以正确的方式解决这个问题。如果指针A
被破坏,则需要在&A
上直接设置数据断点;除非可以设置A != B
的条件断点,否则创建辅助指针不会有用。
如果出现databreakpoint:
- 地址的内容是由数组溢出写的?内容 地址被解释为
的更大数据结构的一部分- 以某种方式由流氓指针写? (探索:64位指针是 取消引用并写入,因此得到一个32位整数 重写)
醇>
当断点地址的值发生变化时会触发它 - 这很简单;片上调试硬件没有语言结构的概念;因此,您需要关注的地址为&A
而不是A
或B
。
如果修改了lastCMDRingstartPtr
,则在实际代码的上下文中,ptrToPtr
也不会更改。只需输入&lastCMDRingstartPtr
作为地址;那么当lastCMDRingstartPtr
的值发生变化时,你就会休息一下。
答案 1 :(得分:0)
我使用的支持中断数据访问的调试硬件并没有像我想大多数人所期望的那样实现。硬件不监视地址处的存储器并在其发生变化时发出断点,它监视CPU的读/写总线,并在给定地址(或地址范围)和正确的宽度。
最终结果是您可以让某些活动无法被硬件捕获。 DMA访问内存是一个很大的问题,你根本无法捕捉(除非你的SRAM / DRAM接口有能力发出这样的错误)。此外,如果您在调试硬件未配置的模式下访问该地址(即,当您正在寻找文字写入时执行字节写入 - 如果您有非常天真的memset / memcpy执行字节访问)
我的猜测是你正在对指针前声明的数组进行一些字节访问,并通过溢出数组来踩踏指针。即使你在指针上设置了访问硬件断点这个词,它也不会被捕获,因为你正在进行字节访问。