559|0

221

帖子

2

TA的资源

纯净的硅(初级)

楼主
 

ESP32软件发生致命错误时的处理办法--Coredump [复制链接]

本帖最后由 walker2048 于 2024-11-3 23:52 编辑

概述

核心转储是软件发生致命错误时,由紧急处理程序自动保存的一组软件状态信息。核心转储有助于对故障进行事后分析,了解软件状态。ESP-IDF 支持生成核心转储。

核心转储包含了系统中所有任务在发生故障时的快照,每个快照都包括任务的控制块 (TCB) 和栈信息。通过分析任务快照,可以确定是哪个任务、在哪个指令(代码行),以及该任务的哪个调用栈导致了系统崩溃。如果将某些变量赋予特殊的核心转储属性,还可以转储这些变量的内容。

 

一、修改menuconfig配置

我们通过修改默认的致命错误处理方式,从打印寄存器和重启,修改成打印寄存器然后停机

 

启用coredump功能

 

修改程序,我们可以在可以执行到的任意程序位置添加assert(0);

让程序直接进入断言错误这种致命错误,查看是否生效。

 

二、运行程序

编译程序后运行,可以看到程序符合预期,在main函数直接发生错误了,并成功将转储文件纯粹到flash里

 

三、通过命令直接查看flash里的coredump关键信息

我们可以通过以下命令,查看一些关键的Coredump信息,例如CPU的寄存器情况,FreeRTOS的线程信息(例如优先级,栈空间使用情况,线程栈帧等等内容)

idf.py coredump-info -p /dev/ttyACM0

 

四、GDB调试

我们还可以进入GDB debug模式进行调试,在命令输入以下内容。通过该命令可以直接加载Flash内存储的Coredump数据,并恢复现场。

 idf.py coredump-debug -p /dev/ttyACM0

加载后的输出如下图,我们还可以输入bt命令来显示栈情况

 

切换线程和栈帧

  查看局部变量

 

总结

使用esp32的coredump功能,可以将致命错误存储到flash里,这样我们在做产品测试的时候,可以不用长期挂着调试器或者串口,一些偶尔出现的致命错误情况,也可以有效的捕获到,并进行现场恢复和调试。

此帖出自RF/无线论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表