十二、e2studio VS STM32CubeIDE之栈回溯cmbacktrace

ops/2024/12/26 11:41:13/

目录

一、概述/目的

二、注意或限制

stm32u575%20cmbacktrace-toc" style="margin-left:0px;">三、stm32u575 cmbacktrace

四、瑞萨ra6m4 cmbacktrace

五、总结


一、概述/目的

  • 我们分享过十四、从0开始卷出一个新项目之瑞萨RZN2L之栈回溯

  • 我们继续分享通用mcu cm33内核stm32u575和瑞萨ra6m4的栈回溯cmbacktrace的例程源码

  • 为了快速定位hardfault,进一步介绍栈回溯的知识

二、注意或限制

  • 栈回溯打印的地址必须与可执行文件(例如elf)匹配,即elf文件和固件版本一一对应

  • 目前提供的源码只针对裸机,rtos需要另外修改

  • 栈回溯与优化等级和调试等级有关系

  • 栈回溯不是万能的,例如栈溢出

stm32u575%20cmbacktrace">三、stm32u575 cmbacktrace

  • cm内核移植比较简单,直接看结果,源码可去github gitee下载测试

  • 修改stack和text地址

  • 修改优化等级none

  • addr2line有报错,可修改debug formart -gdwarf-4

  • 输出日志如下:

hello world! date:Dec 20 2024 time:12:44:05 file:../Core/Src/main.c func:main,line:178 hello world! fault_test_by_div0 Firmware name: CmBacktrace, hardware version: V1.0.0, software version: V0.1.0 Fault on interrupt or bare metal(no OS) environment stack_start_addr=20000000, stack_size=786432, stack_pointer=200bffa8 ===== Thread stack information ===== addr: 200bffa8 data: 200bffc0 addr: 200bffac data: 00000000 addr: 200bffb0 data: 0000000a addr: 200bffb4 data: e000ed14 addr: 200bffb8 data: 200bffc0 addr: 200bffbc data: 08001137 addr: 200bffc0 data: ffffffff addr: 200bffc4 data: 00000001 addr: 200bffc8 data: 200bffd0 addr: 200bffcc data: 08001159 addr: 200bffd0 data: 00000000 addr: 200bffd4 data: 00000001 addr: 200bffd8 data: 200bffe0 addr: 200bffdc data: 08001177 addr: 200bffe0 data: 08008678 addr: 200bffe4 data: 00000001 addr: 200bffe8 data: 200bfff8 addr: 200bffec data: 0800120f addr: 200bfff0 data: 080086a8 addr: 200bfff4 data: 000000b2 addr: 200bfff8 data: 00000000 addr: 200bfffc data: 08001743 ==================================== =================== Registers information ==================== R0 : 0000000a R1 : 00000040 R2 : 0000000a R3 : 00000000 R12: 0000000a LR : 08001137 PC : 080010fe PSR: 41000000 ============================================================== Usage fault is caused by Indicates a divide by zero has taken place (can be set only if DIV_0_TRP is set) Show more call stack info by run: addr2line -e CmBacktrace.elf -afpiC 080010fe 08001136 08001158 08001176 0800120e 08001742
  • addr2line报错日志,可修改debug等级和格式

Jerry.Chen@WTNB-6719 MINGW64 /e/ST_workspace/nucleo_u575_backtrace/Debug $ ./addr2line.exe -e nucleo_u575_backtrace.elf -afpiC 080010fe 08001136 08001158 08001176 0800120e 08001742 0x080010fe: BFD: Dwarf Error: found dwarf version '5', this reader only handles version 2, 3 and 4 information. fault_test_by_div0 at ??:? 0x08001136: BFD: Dwarf Error: found dwarf version '0', this reader only handles version 2, 3 and 4 information. func_c at main.c:? 0x08001158: BFD: Dwarf Error: found dwarf version '7424', this reader only handl es version 2, 3 and 4 information. func_b at main.c:? 0x08001176: BFD: Dwarf Error: found dwarf version '0', this reader only handles version 2, 3 and 4 information. func_a at main.c:? 0x0800120e: BFD: Dwarf Error: found dwarf version '0', this reader only handles version 2, 3 and 4 information. main at ??:? 0x08001742: BFD: Dwarf Error: found dwarf version '0', this reader only handles version 2, 3 and 4 information. LoopForever at startup_stm32u575zitxq.o:?
  • 修改debug等级和格式之后的结果

Jerry.Chen@WTNB-6719 MINGW64 /e/ST_workspace/nucleo_u575_backtrace/Debug $ ./addr2line.exe -e nucleo_u575_backtrace.elf -afpiC 080010fe 08001136 08001158 08001176 0800120e 08001742 0x080010fe: fault_test_by_div0 at E:/ST_workspace/nucleo_u575_backtrace/Debug/../Core/Src/main.c:57 0x08001136: func_c at E:/ST_workspace/nucleo_u575_backtrace/Debug/../Core/Src/main.c:68 0x08001158: func_b at E:/ST_workspace/nucleo_u575_backtrace/Debug/../Core/Src/main.c:74 0x08001176: func_a at E:/ST_workspace/nucleo_u575_backtrace/Debug/../Core/Src/main.c:80 0x0800120e: main at E:/ST_workspace/nucleo_u575_backtrace/Debug/../Core/Src/main.c:190 (discriminator 1) 0x08001742: Reset_Handler at E:/ST_workspace/nucleo_u575_backtrace/Debug/../Core/Startup/startup_stm32u575z itxq.s:100

四、瑞萨ra6m4 cmbacktrace

  • cm内核移植比较简单,直接看结果,源码可去github gitee下载测试

  • 修改stack和text地址

  • 修改优化等级none

  • addr2line有报错,可修改
    Debug level Default (-g)
    Debug format dwarf-4

  • 输出日志如下:

date:Dec 20 2024 time:14:21:19 file:../src/hal_entry.c func:hal_entry,line:204 hello world! PI=3.141593 fault_test_by_div0 Firmware name: CmBacktrace, hardware version: V1.0.0, software version: V0.1.0 Fault on interrupt or bare metal(no OS) environment stack_start_addr=20001750, stack_size=4096, stack_pointer=200026e0 ===== Thread stack information ===== addr: 200026e0 data: 200026f8 addr: 200026e4 data: 00000000 addr: 200026e8 data: 0000000a addr: 200026ec data: e000ed14 addr: 200026f0 data: 200026f8 addr: 200026f4 data: 00000e77 addr: 200026f8 data: 000000ff addr: 200026fc data: 00000001 addr: 20002700 data: 20002708 addr: 20002704 data: 00000e99 addr: 20002708 data: 00000000 addr: 2000270c data: 00000001 addr: 20002710 data: 20002718 addr: 20002714 data: 00000eb7 addr: 20002718 data: 00006850 addr: 2000271c data: 00000001 addr: 20002720 data: 20002730 addr: 20002724 data: 00000f05 addr: 20002728 data: 00006864 addr: 2000272c data: 000000cc addr: 20002730 data: 20001750 addr: 20002734 data: 40490fda addr: 20002738 data: 20002740 addr: 2000273c data: 00001043 addr: 20002740 data: 20002748 addr: 20002744 data: 000023dd addr: 20002748 data: 00000000 addr: 2000274c data: ffffffff ==================================== =================== Registers information ==================== R0 : 0000000a R1 : 20000758 R2 : 0000000a R3 : 00000000 R12: c01243f6 LR : 00000e77 PC : 00000e3e PSR: 49100000 ============================================================== Usage fault is caused by Indicates a divide by zero has taken place (can be set only if DIV_0_TRP is set) Show more call stack info by run: addr2line -e CmBacktrace.elf -afpiC 00000e3e 00000e76 00000e98 00000eb6 00000f04 00001042 000023dc
  • addr2line输出结果

Jerry.Chen@WTNB-6719 MINGW64 /e/RS_workspace/ra6m4_backtrace/Debug $ ./addr2line.exe -e ra6m4_backtrace.elf -afpiC 00000e3e 00000e76 00000e98 00000eb6 00000f04 00001042 000023dc 0x00000e3e: fault_test_by_div0 at E:\RS_workspace\ra6m4_backtrace\Debug/../src/hal_entry.c:78 0x00000e76: func_c at E:\RS_workspace\ra6m4_backtrace\Debug/../src/hal_entry.c:89 0x00000e98: func_b at E:\RS_workspace\ra6m4_backtrace\Debug/../src/hal_entry.c:95 0x00000eb6: func_a at E:\RS_workspace\ra6m4_backtrace\Debug/../src/hal_entry.c:101 0x00000f04: hal_entry at E:\RS_workspace\ra6m4_backtrace\Debug/../src/hal_entry.c:215 0x00001042: main at E:\RS_workspace\ra6m4_backtrace\Debug/../ra_gen/main.c:6 0x000023dc: Reset_Handler at E:\RS_workspace\ra6m4_backtrace\Debug/../ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/startup.c:55

五、总结

  • cmbacktrace移植比较简单,主要修改stack、text地址

  • 栈回溯是有一些限制的

  • 栈回溯功能加入到产品中也是非常有意义的

  • 栈回溯其实就是入栈的反向,了解栈回溯可以深入了解到c代码是如何运行的

图片


http://www.ppmy.cn/ops/145116.html

相关文章

金仓数据库安装-Kingbase v9-centos

在很多年前有个项目用的金仓数据库,上线稳定后就没在这个项目了,只有公司的开发环境还在维护,已经好多年没有安装过了,重温一下金仓数据库安装,体验一下最新版本,也做一个新版本的试验环境; 一、…

echarts5.0以上版本不能使用4.x的map,解决办法

先把echarts 4版本的map文件夹放到项目中 然后在项目中使用 import china from “/utils/map/json/china.json”; import “/utils/map/js/china”; 我是放到utils下面了 在组件中使用的时候加上一行代码就可以了 echarts.registerMap(china, china);

Android笔记:解决fragment+viewpager第二次进入的时候没有数据的问题

在使用ViewPager结合Fragment时,如果第二次无法显示,可能是因为FragmentManager没有正确处理Fragment的状态,或者ViewPager的适配器没有正确处理Fragment的生命周期。 解决方法: 确保你的FragmentPagerAdapter或FragmentStatePa…

排序算法(系列)

希尔排序(Shell Sort)是一种插入排序的改进版本。它是基于插入排序的思想,通过将待排序的元素进行分组,然后对每组进行插入排序,逐步减少分组的大小,最终完成排序。希尔排序的核心思想是将序列分为多个子序…

赛博错题本

机构抽象老师非得让我们整一个错题本,我寻思都学计算机了,还在整高中做题呢一套是什么意思呢,更何况考试也就一周一次,你整个本完完全全没有必要,整个赛博错题本得了。以后错题都会存在这里,基本上一周一更…

C#中的属性索引器(Indexer)

属性索引器(Indexer)是C#中一个非常有用的特性,它允许类的实例像数组一样通过索引进行访问。索引器不仅限于整数索引,还可以使用其他类型,如字符串,作为索引键。这使得索引器在访问集合类型或需要通过键来访…

[源码解析] 模型并行分布式训练Megatron (2) --- 整体架构

link [源码解析] 模型并行分布式训练Megatron (2) --- 整体架构 目录 [源码解析] 模型并行分布式训练Megatron (2) --- 整体架构 0x00 摘要0x01 启动 1.1 分布式启动1.2 构造基础 1.2.1 获取模型1.2.2 获取数据集1.2.3 步进函数 1.2.3.1 广播数据0x02 Pretrain0x03 初始化 3.1 …

Go语言中context 结构原理, 使用场景和用途

Go语言中context结构原理 在Go语言中,context是一个用于在API边界之间传递请求范围的值、取消信号、截止时间等信息的机制。它主要用于处理跨API边界的请求取消、超时控制以及传递请求范围内的共享数据。context的设计目标是为了解决在并发编程中,特别是…