【问题标题】:Atmel Studio: How exacly do data breakpoints trigger?Atmel Studio:数据断点如何准确触发?
【发布时间】:2017-04-12 13:23:18
【问题描述】:

好的,伙计们。我在 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 位整数被覆盖)

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

【问题讨论】:

  • 逻辑必须设计为在地址匹配中断/监视时触发某些东西。因此,在 windows/linux 类型的 cpu 上,您可以只使用 mmu 将地址空间标记为受保护,然后在保护处理程序中决定它是监视地址还是让它通过。如果在微控制器上,您要么需要让调试器进行大量轮询,这并不好,要么有片上逻辑支持。也许您没有进行这些操作,或者调试器没有正确设置手表。
  • 这是 avr 还是 arm 还是其他?我不认为 AVR 可以进行多字写入,arm 当然可以,但如果被监视的地址不是传递的地址而是在多字写入中,那么它会假设那里的逻辑足够聪明,可以在 stm 或 std 上触发。
  • 这不太取决于 Atmel studio 甚至 ICD,而是取决于特定 MCU 支持哪些硬件断点。请说明使用的是哪个 MCU。

标签: embedded atmelstudio atmel-uc3


【解决方案1】:

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

在以下情况下是否触发数据断点:

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

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

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

【讨论】:

  • 好的,我在 Both 上设置了一个数据断点,但两者都没有被触发。经过更多调查,我发现 PointerB 也被损坏了……我怀疑是流氓数组写入。我确信在指针变量上设置的数据断点正在观察指针指向的地址,而不是指针实际所在的地址。所以这是一个错误的假设吗?
  • 我尝试了另一种不使用数据断点的方式进行调查,并找到了罪魁祸首,但为了后代,我想完成这个。现在出现了以下问题,对于那些感兴趣的人,这是新问题的link。
  • 在片上调试中它只是一个地址。 PC 软件设置该地址的方式可能不同 - 这就是文档的用途;我从未使用过 Atmel Studio,但这里似乎很清楚:atmel.com/webdoc/atmelstudio/…。如果您有一个指针ptr,并且您想查看指针值是否发生变化,则location 为&ptr,如果您想知道指向的数据何时发生变化,则只需ptr;但请注意,在这种情况下,您只能在指定地址监视 2 到 4 个字节 - 而不是整个数组。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2021-02-21
    • 1970-01-01
    相关资源
    最近更新 更多