在基于 ARM 的项目上开发时,我们会随机获得数据中止,也就是说,当我们使用它时,我们会得到一个数据中止中断。但是当我们用 r14 或 r13 检查寄存器映射时,数据中止并不总是在同一点,即使检查函数回调也是如此。无论如何,我可以准确地获得有关数据中止根本原因的信息吗?我试过引用 2但是当我捕获有关中断的数据时无法得到相同的观点。
相关 ARM Data Abort error exception debugging ARM: HOW TO ANALYZE A DATA ABORT EXCEPTION
最佳答案
按照上面的 Keil 链接中的描述检查链接寄存器 (r14) 将向您显示触发数据中止的指令。从那里您必须弄清楚为什么它触发了数据中止以及它是如何发生的,这是困难的部分。
根据我的经验,最有可能发生的情况是您访问了一个无效指针。由于多种原因,它可能无效。以下是一些候选人:
- 您在指针初始化之前使用了它
- 您在指针或包含的内存被释放后使用了指针(并且随后在另一个函数分配它时被修改)
- 指针因堆栈溢出而损坏
- 指针被其他不相关的行为不端的代码损坏,这些代码正在践踏内存
- 指针作为局部变量在栈上分配,然后在分配函数退出后使用
- 指针的类型对齐不正确(例如,尝试将 0x4001 作为 uint32_t 访问)
如您所见,很多事情都可能是 ARM 数据中止的根本原因。找到根本原因是 ARM 软件/固件开发如此有趣的部分原因!祝您解开谜题好运。
关于c - 如何在基于 arm 的平台上调试随机数据中止问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11474700/