嵌入式系统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技术交流群:158631242

版权声明:本文为CSDN博主「中移OneOS」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Abby_Wang1248/article/details/122662541

中移OneOS

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

MDK 分散加载文件剖析(一)

1、何为分散加载? 1.1 简介 分散加载就是我们开发者能指定你的 代码 或者 数据变量 到指定的内存空间中运行。通知链接器把程序的某一部分连接在存储器的某个地址空间,我们可以通过编写一个分散加载文件来指定 ARM

STM32L152 的参考电压Vrefint输出

最近在做一个项目需要输出单片机内部参考电压.使用stm32cube生成的代码无法正常在引脚上输出内部参考电压. 根据数据手册的显示: 根据手册的意思首先使能输出,然后使能管脚状态.   /** Enables the output of

ESP8266与PCA9685通信I2C

ESP8266与PCA9685通信I2C Talk is cheap, show you code! /*** ESP8266与PCA9685通过I2C协议通信* 功能:控制PCA9685上的16个舵机旋转0-18

stm32——4、中断exti

这里是基于正点原子开发板的学习记录。 首先你要加入固件库 stm32f10x_exti.h 和 stm32f10x_exti.c 1、STM32中每个io口都可以作为外部中断的中断输入口。 2、STM32F103的中断控制器支持19个外部中断/