一个进入维护周期的产品,经常出现DA(DATA ABORT,linux下面叫segment fault)。利用VXWORKS的异常处理钩子,记录了异常出现时的寄存器和调用栈 ,下图是2次异常截图
可以看到,出现DA异常时,异常指令都是相同的地址(PC=0x1ac868),利用反汇编objdump编译结果vxworks.st,得出调用栈和最终出现异常的函数
1ac868: 80 1c 00 04 lwz r0,4(r28) ROS_MemBlkAlloc
1adc94: 80 01 00 24 lwz r0,36(r1) ROS_MemDynAlloc_X
这是我们的自定义块内存分配函数,这套代码在几十个产品都运行的很稳定,不应该有问题?分析出现异常的指令,lwz r0,4(r28)。这是一条内存读