Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
backtrace
CmBacktrace
risc-v_RISCV
RVBacktrace RISC-V极简栈回溯组件V1.2
发布于 2024-09-19 17:48:34 浏览:301
订阅该版
[tocm] ![screenshot_logo.png](https://oss-club.rt-thread.org/uploads/20240919/6f7647580dccbf34354218a05f7ac68c.png) ## 简介 RVBacktrace是一个极简的RISC-V栈回溯组件。用于断言或异常等情况下的辅助调试。 组件链接:https://github.com/Yaochenger/RvBacktrace 感觉不错小星星支持一下叭! ## API介绍 RVBacktrace组件仅包含一个面向用户的API,用户在需要的地方调用该函数可以进行从当前位置进行栈回溯,用户可将该API对接到断言函数或者在异常中调用,辅助调试。 ```c void rvbacktrace(void); ``` ## 组件配置 组件支持两种方式栈回溯,默认使用配置简单的方式一。 方式一:不添加编译参数,通过调用栈结构进行栈回溯,默认十一哦。 优点:不额外占用系统寄存器 缺点:增加代码空间,效率较方式二较低 方式二:通过添加编译参数的方式,基于FP寄存器进行栈回溯。 优点:几乎不增加代码空间 缺点:占用s0寄存器, ## 使用方法 ### 方式一: 默认使用方式一,首先确认链接脚本中存在下述符号 ```c extern char *__etext; extern char *__stext; ``` 若不存在,在连接脚本中添加,`__ etext`位于代码段的开始,`__stext`位于代码段的末尾,链接脚本中的示例添加位置: ```c PROVIDE (__stext = .); .text (__vector_load_addr__ + __vector_ram_end__ - __vector_ram_start__) : { . = ALIGN(8); *(.text) *(.text*) *(.rodata) *(.rodata*) *(.srodata) *(.srodata*) ... /* section information for usbh class */ . = ALIGN(8); __usbh_class_info_start__ = .; KEEP(*(.usbh_class_info)) __usbh_class_info_end__ = .; } > XPI0 .rel : { KEEP(*(.rel*)) } > XPI0 PROVIDE (__etext = .); ``` 在期望栈回溯的地方插入rvbacktrace函数,示例如下: ```c void thread_entry(void *arg) { rt_thread_mdelay(500); extern void rvbacktrace(); rvbacktrace(); while(1){ app_led_write(0, APP_LED_ON); rt_thread_mdelay(500); app_led_write(0, APP_LED_OFF); rt_thread_mdelay(500); } } ``` ### 运行结果: ``` ---- RV_Backtrace Call Frame Start: ---- ###Please consider the value of ra as accurate and the value of sp as only for reference### ------------------------------Thread: led_th backtrace------------------------------ [0]Stack interval :[0x000000000108f868 - 0x000000000108f878] ra 0x000000008000cc6c pc 0x000000008000cc6a [1]Stack interval :[0x000000000108f878 - 0x000000000108f888] ra 0x000000008000cc6a pc 0x000000008000cc68 [2]Stack interval :[0x000000000108f888 - 0x000000000108f898] ra 0x000000008000c92e pc 0x000000008000c92c [3]Stack interval :[0x000000000108f898 - 0x000000000108f8a0] ra 0x000000008001007e pc 0x000000008001007a End of stack backtracking addr2line -e rtthread.elf -a -f 8000cc6a 8000cc68 8000c92c 8001007a ---- RV_Backtrace Call Frame End:---- ``` ### 方式二: 首先在rvacktrace.h中定义BACKTRACE_USE_FP ```c #define BACKTRACE_USE_FP ``` 在C/C++以及汇编的编译选项下添加`-fno-omit-frame-pointer`编译参数,RT-Studio中的添加方式示例: ![screenshot_1.png](https://oss-club.rt-thread.org/uploads/20240919/1ef59b30b837d020573a54bdcf9deecc.png.webp) 在期望栈回溯的地方插入rvbacktrace函数,示例如下: ```c void thread_entry(void *arg) { rt_thread_mdelay(500); extern void rvbacktrace(); rvbacktrace(); while(1){ app_led_write(0, APP_LED_ON); rt_thread_mdelay(500); app_led_write(0, APP_LED_OFF); rt_thread_mdelay(500); } } ``` 运行结果: ``` ---- RV_Backtrace Call Frame Start: ---- ###Please consider the value of ra as accurate and the value of sp as only for reference### ------------------------------Thread: led_th backtrace------------------------------ Current Thread Name: led_th [0]Stack interval :[0x0000000001090388 - 0x0000000001090398] ra 0x000000008000d114 pc 0x000000008000d110 [1]Stack interval :[0x0000000001090398 - 0x00000000010903a8] ra 0x000000008000cfba pc 0x000000008000cfb6 [2]Stack interval :[0x00000000010903a8 - 0x00000000010903b8] ra 0x000000008001095a pc 0x0000000080010956 [3]Stack interval :[0x00000000010903b8 - 0x00000000deadbeef] ra 0x0000000001086a7c pc 0x0000000001086a78 addr2line -e rtthread.elf -a -f 8000d110 8000cfb6 80010956 1086a78 ---- RV_Backtrace Call Frame End:---- ``` 上述信息便是当前的栈回溯信息,除此之外组件输出addr2line工具支持的栈回溯命令,使用addr2line命令运行下述代码即可查看函数调用栈与函数符号。 ```stylus addr2line -e rtthread.elf -a -f 8000d110 8000cfb6 80010956 1086a78 ``` 方式二支持对当前系统所有的线程进行栈回溯,在rvacktrace.h中定义BACKTRACE_ALL ```c #define BACKTRACE_ALL ``` 重新执行上述代码,运行结果: ``` ---- RV_Backtrace Call Frame Start: ---- ###Please consider the value of ra as accurate and the value of sp as only for reference### ------------------------------Thread: led_th backtrace------------------------------ Current Thread Name: led_th [0]Stack interval :[0x0000000001090390 - 0x00000000010903a0] ra 0x000000008000d26e pc 0x000000008000d26a [1]Stack interval :[0x00000000010903a0 - 0x00000000010903b0] ra 0x000000008000cfba pc 0x000000008000cfb6 [2]Stack interval :[0x00000000010903b0 - 0x00000000010903c0] ra 0x0000000080010ac2 pc 0x0000000080010abe [3]Stack interval :[0x00000000010903c0 - 0x00000000deadbeef] ra 0x0000000001086a7c pc 0x0000000001086a78 addr2line -e rtthread.elf -a -f 8000d26a 8000cfb6 80010abe 1086a78 ------------------------------Thread: tshell backtrace------------------------------ [1]Thread Name: tshell [0]Stack interval :[0x000000000108fea0 - 0x000000000108fed0] ra 0x0000000001083f5c pc 0x0000000001083f58 [1]Stack interval :[0x000000000108fed0 - 0x000000000108fee0] ra 0x0000000001084782 pc 0x000000000108477e [2]Stack interval :[0x000000000108fee0 - 0x000000000108ff00] ra 0x0000000080009d80 pc 0x0000000080009d7c [3]Stack interval :[0x000000000108ff00 - 0x000000000108ff10] ra 0x0000000080009eec pc 0x0000000080009ee8 [4]Stack interval :[0x000000000108ff10 - 0x00000000deadbeef] ra 0x0000000001086a7c pc 0x0000000001086a78 addr2line -e rtthread.elf -a -f 1083f58 108477e 80009d7c 80009ee8 1086a78 ------------------------------Thread: tidle0 backtrace------------------------------ [2]Thread Name: tidle0 [0]Stack interval :[0x000000000108bf70 - 0x00000000deadbeef] ra 0x0000000001086a7c pc 0x0000000001086a78 addr2line -e rtthread.elf -a -f 1086a78 ------------------------------Thread: timer backtrace------------------------------ [3]Thread Name: timer [0]Stack interval :[0x000000000108c408 - 0x000000000108c428] ra 0x0000000001088636 pc 0x0000000001088632 [1]Stack interval :[0x000000000108c428 - 0x00000000deadbeef] ra 0x0000000001086a7c pc 0x0000000001086a78 addr2line -e rtthread.elf -a -f 1088632 1086a78 ------------------------------Thread: main backtrace------------------------------ [4]Thread Name: main [0]Stack interval :[0x000000000108ebd8 - 0x000000000108ec08] ra 0x0000000001086f68 pc 0x0000000001086f64 [1]Stack interval :[0x000000000108ec08 - 0x000000000108ec18] ra 0x0000000001087096 pc 0x0000000001087092 [2]Stack interval :[0x000000000108ec18 - 0x000000000108ec28] ra 0x0000000080010b84 pc 0x0000000080010b80 [3]Stack interval :[0x000000000108ec28 - 0x000000000108ec38] ra 0x0000000080006890 pc 0x000000008000688c [4]Stack interval :[0x000000000108ec38 - 0x00000000deadbeef] ra 0x0000000001086a7c pc 0x0000000001086a78 addr2line -e rtthread.elf -a -f 1086f64 1087092 80010b80 8000688c 1086a78 Thread Total Num: 5 ---- RV_Backtrace Call Frame End:---- ``` 该模式用于tshell线程可以正常执行时打印输出当前系统所有线程的调用栈,用于辅助分析死锁,线程异常挂起等现象 ## 验证平台 | 芯片/内核 | 验证结果 | | :---------------: | :------: | | D1/XuanTianC906 | pass | | CH32V307/RISC-V4F | pass | | HPM6750/Andes D45 | pass | ## 参考链接 上手说明:https://club.rt-thread.org/ask/article/64bfe06feb7b3e29.html
6
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
rv666
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
文章
20
回答
56
被采纳
9
关注TA
发私信
相关文章
1
cm_backtrace怎么定位Usage fault问题点呢
2
有没有RISC-V版本的backtrace?
3
第一次编译报错,找不到文件
4
崩溃了,没有打印线程信息,问题不知道怎么定位
5
rt-thread有没有什么工具可以分析程序异常后输出的打印信息
6
如何移植cortex-a的backtrace到V4.1.1上?
7
使用CmBacktrace定位错误异常,请教分析原因
8
cm_backtrack 使用ulog时,不能打印最后的堆栈调用信息
9
rtthread studio 中使用 cm_backtrace没有正常输出
10
rt thread studio下nano工程如何使用Cmb组件
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
5
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部