本帖最后由 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里,这样我们在做产品测试的时候,可以不用长期挂着调试器或者串口,一些偶尔出现的致命错误情况,也可以有效的捕获到,并进行现场恢复和调试。