嵌入式系统coredump分析

本文分享自中移OneOS微信公众号《嵌入式系统coredump分析》,作者:柏灵。

在进行嵌入式产品开发过程中,不可避免的会遇到,功能开发完了,固件烧进去了,测试拿去测了,然后测着测着,程序崩溃了!

问题解决思路

当遇到程序崩溃问题时,我们最先想知道的是,程序是在哪里崩溃的?最简单的方法是获取程序指针寄存器,比如在使用cortex-m开发时,只需要将程序崩溃时的PC值存到flash上或打印出来即可。但是当查看map表时,很可能发现PC指向的函数是memcpy等通用函数!对问题解决并不能提供有效信息。

所以对于大多数程序崩溃问题,最好能获得完整的调用栈和栈上的临时变量,这正好是coredump的主要功能。

eCoreDump组件介绍

OneOS的eCoreDump组件,主要功能是生成elf格式的core file,配合修改过的嵌入式gdb,完成嵌入式系统的coredump分析功能。具体流程是,在程序出现问题时,调用eCoreDump组件接口,将寄存器的值与内存内容组织成elf格式的core file,core file可以选择直接从串口输出,或者保存到flash。

eCoreDump组件工作流程:

生成的Core文件,转移到PC上并保存为文件后,格式如下:

 配置开发与运行

OneOS-Cube配置

eCoreDump组件依赖于fal组件的flash存储功能与shell功能,所以在开启eCoreDump前需保证开发板的fal接口可用,shell组件使能。

使用menuconfig使能eCoreDump功能:

(Top) → Components → Diagnose → eCoreDump
                                                        OneOS Configuration
[*] Using eCoreDump
        Select the arch (armv7m)  --->
[*]     Using example

编译、下载与运行

在使能eCoreDump组件后,即可使用keil或gcc编译固件,具体的编译与下载操作步骤参考OneOS开发文档

eCoreDump组件新增了4条shell命令:

trigger_assert
trigger_fault
corefile_dump
corefile_count

trigger_fault命令提供一个hardfault示例,执行后会触发hardfault,生成的core file保存到flash,分析的过程在下一节介绍。

trigger_assert命令会触发assert,并将生成的core file打印到串口上,分析过程参考hardfault示例。

corefile_count命令用于查看当前flash上存储了几个core file,corefile_dump命令将core file打印到串口上。

使用GDB分析hardfault

为了演示eCoreDump组件功能,下面构造一段会导致hardfault的代码,系统崩溃原因为非法的函数指针调用。

fault_func func = (fault_func)0xFFFF0000;
int x, y;
const char * sx = "84597";
const char * sy = "35268";

float a, b, c;
const char * fsa = "1.1322";
const char * fsb = "45.2547";
const char * fsc = "7854.2";

a = atof(&fsa[0]);
b = atof(&fsb[0]);
c = atof(&fsc[0]);

x = atoi(&sx[0]);
y = atoi(&sy[0]);

func(x * a + y * b * c);

return 0;

当hardfault发生后,重启芯片,使用shell命令查看生成的core file(其中文件内容通过hex格式打印):

在PC上使用ecdView进行coredump分析的流程为:

1)将hex格式的文件内容复制到ecdView的第一个文本框中,将hex格式的内容转化为二进制格式并保存为文件。
2)使用OpenElf按键,选择程序的elf文件路径。
3)使用BeginGDB按键,启动gdb进程进行core file解析。

gdb解析的结果如下:

 gdb与ecdView下载地址:https://gitee.com/cmcc-oneos/openOCD/releases

OneOS是中国移动针对物联网领域推出的轻量级操作系统,具有可裁剪、跨平台、低功耗、高安全等特点,支持ARM Cortex-M/R/A、MIPS、RISC-V等主流CPU架构,兼容POSIX、CMSIS等标准接口,支持Micropython语言开发,提供图形化开发工具,能够有效提高开发效率并降低开发成本,帮助客户开发稳定可靠、安全易用的物联网应用。 官网地址:https://os.iot.10086.cn/
OneOS软件地址:http://www.oschina.net/p/cmcc-oneos
OneOS项目地址:https://gitee.com/cmcc-oneos/OneOS
OneOS技术交流群:158631242

{{o.name}}
{{m.name}}

猜你喜欢

转载自my.oschina.net/u/5443273/blog/5411900