ESP32软件发生致命错误时的处理办法--Coredump
<div class='showpostmsg'> 本帖最后由 walker2048 于 2024-11-3 23:52 编辑<h2>概述</h2>
<p>核心转储是软件发生致命错误时,由紧急处理程序自动保存的一组软件状态信息。核心转储有助于对故障进行事后分析,了解软件状态。ESP-IDF 支持生成核心转储。</p>
<p>核心转储包含了系统中所有任务在发生故障时的快照,每个快照都包括任务的控制块 (TCB) 和栈信息。通过分析任务快照,可以确定是哪个任务、在哪个指令(代码行),以及该任务的哪个调用栈导致了系统崩溃。如果将某些变量赋予特殊的核心转储属性,还可以转储这些变量的内容。</p>
<p> </p>
<p><span style="font-size:16px;"><strong>一、修改menuconfig配置</strong></span></p>
<p>我们通过修改默认的致命错误处理方式,从打印寄存器和重启,修改成打印寄存器然后停机</p>
<p> </p>
<p>启用coredump功能</p>
<p> </p>
<p>修改程序,我们可以在可以执行到的任意程序位置添加assert(0);</p>
<p>让程序直接进入断言错误这种致命错误,查看是否生效。</p>
<p> </p>
<p><strong>二、运行程序</strong></p>
<p>编译程序后运行,可以看到程序符合预期,在main函数直接发生错误了,并成功将转储文件纯粹到flash里</p>
<p> </p>
<p><strong>三、通过命令直接查看flash里的coredump关键信息</strong></p>
<p>我们可以通过以下命令,查看一些关键的Coredump信息,例如CPU的寄存器情况,FreeRTOS的线程信息(例如优先级,栈空间使用情况,线程栈帧等等内容)</p>
<p>idf.py coredump-info -p /dev/ttyACM0</p>
<p> </p>
<p><strong>四、GDB调试</strong></p>
<p>我们还可以进入GDB debug模式进行调试,在命令输入以下内容。通过该命令可以直接加载Flash内存储的Coredump数据,并恢复现场。</p>
<p> idf.py coredump-debug -p /dev/ttyACM0</p>
<p>加载后的输出如下图,我们还可以输入bt命令来显示栈情况</p>
<p> </p>
<p>切换线程和栈帧</p>
<p> 查看局部变量</p>
<p> <span style="font-size:16px;"><strong> </strong></span></p>
<p><span style="font-size:16px;"><strong>总结</strong></span></p>
<p>使用esp32的coredump功能,可以将致命错误存储到flash里,这样我们在做产品测试的时候,可以不用长期挂着调试器或者串口,一些偶尔出现的致命错误情况,也可以有效的捕获到,并进行现场恢复和调试。</p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>
页:
[1]