全部文档
概述 硬件支持 快速开发指南 内核 驱动 通用组件 专业组件 常见问题

eCoreDump组件

简介

eCoreDump组件实现了嵌入式系统的coredump功能。

配合使用的gdb是针对嵌入式系统修改的,下载路径为arm-none-eabi-gdb

代码结构

eCoreDump组件源代码相对路径为.\components\debug\eCoreDump,结构如下表所示:

文件名 功能
example 示例
inc 头文件,提供组件接口
port 移植文件
src 源代码文件
test 测试文件

功能介绍

eCoreDump组件主要提供下面两个功能:

  1. 当assert发生后,生成coredump文件并通过log打印出来。
  2. 发生硬件异常时触发,生成coredump文件并保存到flash上。

使用说明

图形化配置

使用eCoreDump组件可以通过Menuconfig的图形化工具进行配置选择,配置的路径如下所示:

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

以上配置完成后退出并保存配置,重新生成工程后,编译运行OneOS。

运行示例

当代码主动调用ecd_multi_dumpecd_mini_dump接口时,程序会以当前调用栈生成corefile,两个接口的区别为是否包含其他线程的信息。在这两个接口内部,会保存mcu寄存器和栈内存,这部分代码依赖于mcu架构和rtos。

eCoreDump的示例代码构造了assert的场景,在shell中输入trigger_assert命令触发。

sh />trigger_assert
Assert failed. Condition(x * a == y * b * c). [sh_trigger_assert][104]
coredump start : {
7f454c460101016100000000000000000400280001000000000000 ...
} coredump end
crc32 : be8f1ddb
sh />

生成的corefile以hex字符串的方式打印到终端,至此嵌入式端的工作完成,接下来PC上的操作步骤如下:

  1. 将hex字符串格式的corefile转化为二进制文件。例如,hex字符串的内容为“454c46”,转化后的二进制文件长度为3个字节,内容为“ELF”。
  2. 调用gdb解析corefile,arm-none-eabi-gdb oneos.elf corefile

上面的操作可以由辅助工具ecdView.exe完成,操作步骤如下:

  1. 将hex字符串格式的corefile复制到文本框中,
  2. Open按钮选择elf文件路径,
  3. gdb按钮启动gdb,解析coredump。

使用gdb命令解析coredump文件。

(gdb) info threads
  Id   Target Id         Frame
* 1    Task 3539         ecd_multi_dump () at ..\\..\\components\\diagnose\\eCoreDump\\src\\armv7m\\/armv7m.c:122
  2    Task 3540         k_kernel_exit_sched () at ..\..\kernel\source\/os_sched.c:302
  3    Task 3541         k_kernel_exit_sched () at ..\..\kernel\source\/os_sched.c:302
  4    Task 3542         k_kernel_exit_sched () at ..\..\kernel\source\/os_sched.c:302
  5    Task 3543         _k_idle_task_entry (arg=<optimized out>) at ..\..\kernel\source\/os_idle.c:17
  6    Task 3544         k_kernel_exit_sched () at ..\..\kernel\source\/os_sched.c:302
  7    Task 3545         k_kernel_exit_sched () at ..\..\kernel\source\/os_sched.c:302
  8    Task 3546         k_kernel_exit_sched () at ..\..\kernel\source\/os_sched.c:302
  9    Task 3547         k_kernel_exit_sched () at ..\..\kernel\source\/os_sched.c:302
(gdb) bt
#0  ecd_multi_dump () at ..\\..\\components\\diagnose\\eCoreDump\\src\\armv7m\\/armv7m.c:122
#1  0x0800c49a in after_assert_fail () at ..\..\components\diagnose\eCoreDump\example\trigger_dump.c:69
#2  0x0802a4c2 in sh_trigger_assert (argc=1, argv=0x2000cf30 <stack_shell_stack+1912>) at ..\..\components\diagnose\eCoreDump\example\trigger_dump.c:97
#3  0x0802880c in sh_do_exec_cmd (cmd=0x2000d1f9 <gs_shell+465> "trigger_assert", length=14, retp=0x2000cf78 <stack_shell_stack+1984>) at ..\..\components\shell\source\/shell_process.c:197
#4  0x0802892e in sh_exec (cmd=0x2000d1f9 <gs_shell+465> "trigger_assert", length=14) at ..\..\components\shell\source\/shell_process.c:237
#5  0x08028c7e in sh_handle_enter_key (shell_info=0x2000d028 <gs_shell>) at ..\..\components\shell\source\/shell_main.c:545
#6  0x08028c0c in sh_handle_control_key (shell_info=0x2000d028 <gs_shell>, ch=13 '\r') at ..\..\components\shell\source\/shell_main.c:638
#7  0x0802a3c4 in sh_task_entry (arg=<optimized out>) at ..\..\components\shell\source\/shell_main.c:723

异常coredump与corefile保存功能

当程序发生异常时,程序会根据发生异常的调用栈生成corefile,并保存到flash中。示例中增加了trigger_fault命令触发hardfault。

硬件异常触发后程序停止,此时需要重启设备查看coredump文件,设备上可以保存多个coredump文件,使用corefile_count查看。

sh />corefile_count
core file count : 1
sh />

使用corefile_dump命令打印出coredump文件,同样是hex字符串格式。corefile_dump命令的参数为coredump文件索引,0为距现在最久的。

sh />corefile_dump 0
core file (idx : 0) {
7f454c4601010161000000000000000004002800 ...
}
crc32 : 43930a92
sh />

解析coredump文件的流程同上。

results matching ""

    No results matching ""