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) 有时候定位到对应地址的函数不准确怎么办?

    1. 需要用户根据代码目前正在运行的功能流程推测死机范围

    1. 有时候内存被篡改,并不是马上出发异常,而且当被篡改的内存访问的时候才触发

    1. 寻求FAE援助

(3) 有时候发现内存被篡改,但是没有造成异常,应该如何查找?

答:使用硬件保护软件不能够改写的地址范围, 如果软件改写就触发异常

(4) 栈溢出 stackoverflow 怎么办?

答:增大异常打印中current_task指出的任务

(4) 如果出现死机不复位的情况怎么办?

答:调用wdt_reset_enable,让看门狗溢出不经过异常函数直接复位, 并且需要打开宏EXPCPTION_IN_SRAM,防止flash挂了,进入异常函数失败复位不了