C 如何在arm平台上调试随机数据中止问题

C 如何在arm平台上调试随机数据中止问题,c,embedded,arm,C,Embedded,Arm,在基于ARM的项目上开发时,我们随机得到数据中止,也就是说,当我们使用它时,我们得到一个数据中止中断。但是,当我们使用r14或r13检查寄存器映射时,数据中止并不总是在同一点上,即使检查函数回调也是如此。我是否可以准确地获得有关数据中止根本原因的信息?我尝试了ref,但当我捕获有关中断的数据时,无法获得相同的点 相关的 如上面Keil链接中所述,检查链接寄存器(r14)将向您显示触发数据中止的指令。从这里,您必须弄清楚它为什么会触发数据中止,以及这是如何发生的,这是困难的部分 根据我的经验,最有

在基于ARM的项目上开发时,我们随机得到数据中止,也就是说,当我们使用它时,我们得到一个数据中止中断。但是,当我们使用r14或r13检查寄存器映射时,数据中止并不总是在同一点上,即使检查函数回调也是如此。我是否可以准确地获得有关数据中止根本原因的信息?我尝试了ref,但当我捕获有关中断的数据时,无法获得相同的点

相关的

如上面Keil链接中所述,检查链接寄存器(r14)将向您显示触发数据中止的指令。从这里,您必须弄清楚它为什么会触发数据中止,以及这是如何发生的,这是困难的部分

根据我的经验,最有可能发生的是您访问了无效指针。它可能因多种原因而无效。以下是一些候选人:

  • 您在初始化指针之前使用了它
  • 您在指针或包含它的内存被释放后使用了它(随后在另一个函数分配它时被修改)
  • 指针被堆栈溢出损坏
  • 指针被其他不相关的行为不端的代码损坏,这些代码正在破坏内存
  • 指针作为局部变量分配到堆栈上,然后在分配函数退出后使用
  • 指针的类型对齐不正确(例如,试图作为uint32\u t访问0x4001)

  • 正如您所看到的,很多事情可能是ARM数据中止的根本原因。找到根本原因是使ARM软件/固件开发如此有趣的一部分!祝你好运解决你的难题。

    嗨,安德鲁,如果我想知道关于案例4的更多信息,我可以使用jtag和ice从寄存器映射中获得这些信息吗,也就是说,我想知道哪条线将重写指针指向的内存。在这种情况下,它提供了一种获得问题区域的方法,但是如果我的接口是10针jtag接口呢?谢谢分享这个答案。它有助于检查此问题的根本原因。