Skip to content

死机问题分析

通过重启原因值判断

通过yopen_get_powerup_reason接口,获取重启原因值, 死机原因主要可以分三类:

  1. YOPEN_REASON_ASSERT:开发者添加的ASSERT用于检查代码中的异常
  2. YOPEN_REASON_WDT : 系统阻塞导致无法喂狗,出现的异常
  3. YOPEN_REASON_HARDFAULT : 除去assert和wdt的所有异常,包含指针异常,硬件操作异常等

通过死机dump分析

死机现场导出

软件设置yopen_debug_set_fault_action(YOPEN_EXCEP_OPTION_DUMP_FLASH_EPAT_LOOP),当遇到异常后,EPAT 工具会自动打开 RamDump 对话框:选择elf文件和工具路径

USB描述符

关闭弹出窗口。和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文件打开问题现场,可以看到类似如下窗口:

USB描述符

常见问题分析

常见案例1 - 指针地址错误

USB描述符

PC值为0x008d961a, 对应的指令为str r2,[r3],由于r3是0导致死机

常见案例2 - 看门狗异常

目前喂狗动作在idle task中优先级是最低的, 只要其他的task存在while(1)或者长时间阻塞就会导致看门狗重启.

通过task list中的状态判断可能存在阻塞的task:

USB描述符

结合日志:

USB描述符

常见案例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

USB描述符

常见案例4 - 内存泄漏

如下图所示,查询node_hash, 记录了malloc的长度, task_name信息等信息, excepti task中存在多次malloc 10K数据, 可能存在内存泄漏。

USB描述符

常见案例5 - ASSERT死机

USB描述符