c - 如何在基于 arm 的平台上调试随机数据中止问题

标签 c embedded arm

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

相关 ARM Data Abort error exception debugging ARM: HOW TO ANALYZE A DATA ABORT EXCEPTION

最佳答案

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

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

  1. 您在指针初始化之前使用了它
  2. 您在指针或包含的内存被释放后使用了指针(并且随后在另一个函数分配它时被修改)
  3. 指针因堆栈溢出而损坏
  4. 指针被其他不相关的行为不端的代码损坏,这些代码正在践踏内存
  5. 指针作为局部变量在栈上分配,然后在分配函数退出后使用
  6. 指针的类型对齐不正确(例如,尝试将 0x4001 作为 uint32_t 访问)

如您所见,很多事情都可能是 ARM 数据中止的根本原因。找到根本原因是 ARM 软件/固件开发如此有趣的部分原因!祝您解开谜题好运。

关于c - 如何在基于 arm 的平台上调试随机数据中止问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11474700/

相关文章:

c - tail exec 在管道中不能很好地工作(直到父进程死亡才输出!)

c - 在 yacc 中解析赋值语句时出现语法错误

c++ - ARM STM32需要兼容的编译器

linux - 如何调试 arm9 2.4.19 linux 挂起?

c++ - 模运算与三元运算

c - 在管道中添加时钟叠加并正确使用 capsfilter

c++ - 几次访问后,mmap 因无法打开/dev/mem 而死

C启动代码只写汇编困惑

c - 如何避免系统设置的 EEPROM 结构中的全局变量?

ubuntu - 为ARM编译时openssl无法编译,否则工作正常