7.6. 异常定位与分析
Overview
本示例模拟了多种情况下程序异常的情况,以及异常分析与定位的方法, 更多详细软件调试相关方法(请点击跳转) 。
7.6.1. DEMO
使用工程:示例代码见 apps/common/example/system/exception/main.c
,测试时需要在 apps/demo/demo_DevKitBoard/include/demo_config.h
,开启宏 USE_EXCEPTION_TEST_DEMO
。
7.6.2. 操作流程
根据示例中的注释链入对应的代码进行编译测试。
查看串口打印中的exception error,对比不同情况下的死机打印信息,如:
如果异常为axi_rd_inv或者axi_wr_inv,可以通过id号来确定最后一个运行地址在那个cpu中,这样可以更准确地确定异常地址,如:
通过
cpu/wl82/tools/定位异常地址.bat
输入reti或者rets地址(注意:输入的地址必须要要有0x开头 )定位到对应地址的函数。
7.6.3. 常见问题
(1) 通常程序异常情况有哪些?
答:非对齐访问,指令非法,读写访问非法地址,除0异常,栈溢出,程序卡死看门狗复位
(2) 有时候定位到对应地址的函数不准确怎么办?
需要用户根据代码目前正在运行的功能流程推测死机范围
有时候内存被篡改,并不是马上出发异常,而且当被篡改的内存访问的时候才触发
寻求FAE援助
(3) 有时候发现内存被篡改,但是没有造成异常,应该如何查找?
答:使用硬件保护软件不能够改写的地址范围, 如果软件改写就触发异常
(4) 栈溢出 stackoverflow 怎么办?
答:增大异常打印中current_task指出的任务
(4) 如果出现死机不复位的情况怎么办?
答:调用wdt_reset_enable,让看门狗溢出不经过异常函数直接复位, 并且需要打开宏EXPCPTION_IN_SRAM,防止flash挂了,进入异常函数失败复位不了