死机问题分析
通过重启原因值判断
通过yopen_get_powerup_reason接口,获取重启原因值, 死机原因主要可以分三类:
- YOPEN_REASON_ASSERT:开发者添加的ASSERT用于检查代码中的异常
- YOPEN_REASON_WDT : 系统阻塞导致无法喂狗,出现的异常
- YOPEN_REASON_HARDFAULT : 除去assert和wdt的所有异常,包含指针异常,硬件操作异常等
通过死机dump分析
死机现场导出
软件设置yopen_debug_set_fault_action(YOPEN_EXCEP_OPTION_DUMP_FLASH_EPAT_LOOP),当遇到异常后,EPAT 工具会自动打开 RamDump 对话框:选择elf文件和工具路径
关闭弹出窗口。和Log保存
操作一样,点击工具中的Log保存
按钮,保存当前log即可。log的zip文件中,会包含死机dump的bin文件,同时把固件对应的elf一起保存,供分析。
死机现场分析
- 默认情况下设备发生错误时生成的 Dump 文件在工具当前目录
bin/Ramdump
下,可以通过 Browe 按钮来
选择正确的 Dump 文件
- Axf/elf File:设备中固件对应的elf 文件。
- 选择Trace32
- 以上的信息都正确选择后,点击 OK 按钮,会显示死机问题分析现场。
- 如果trace32加载出现错误,可以手动打开Trace32,通过
File->Run Script...
运行位于EPAT工bin/hw_dev.cmm
文件打开问题现场,可以看到类似如下窗口:
常见问题分析
常见案例1 - 指针地址错误
PC值为0x008d961a, 对应的指令为str r2,[r3],由于r3是0导致死机
常见案例2 - 看门狗异常
目前喂狗动作在idle task中优先级是最低的, 只要其他的task存在while(1)或者长时间阻塞就会导致看门狗重启.
通过task list中的状态判断可能存在阻塞的task:
结合日志:
常见案例3 - 内存破坏
free死机, 查看pv=0x0043D95C的地址,如下图能看到malloc size是0x20
tail flag =pv(0x0043D95C)+0x20 tail标识0xdeadbeaf 标识被破坏
4 bytes | 8 bits | 24 bits | 4 bytes | 4 bytes | Malloc 长度 | 4 bytes |
---|---|---|---|---|---|---|
HEAD=0xbeafdead | tasknumber | Func addr | Malloc size | Real size | Malloc 数据 | tail=0xdeadbeaf |
常见案例4 - 内存泄漏
如下图所示,查询node_hash, 记录了malloc的长度, task_name信息等信息, excepti task中存在多次malloc 10K数据, 可能存在内存泄漏。