物奇5007crash问题dump、栈回溯的四种定位方法

news2024/11/19 23:33:46

概述

物奇属于RISC-V架构(chapter1_riscv.md · 华中科技大学操作系统团队/pke-doc - Gitee.com),在遇到crash问题时,系统内部会对内存进行相关的保护和检测,当发现异常时会主动调用 IOT_ASSERT,通常会产生相关的 log 文件, 如: ***.c:xxx Asserted! 出现异常时的现场 dump 记录,将通用的 32 个 CPU 寄存器 dump 输出。回栈信息记录。出现异常时的堆栈信息以及调用函数地址。

 以空指针拷贝导致crash为例:

第一种:addr2line内存调试工具回溯

addr2line将地址转换为文件名和行号。鉴于可执行文件中的地址或可重定位文件部分中的偏移量对象,它使用调试信息来确定哪个文件名以及行号与之相关联。

示例: addr2line -C -f -e xxx.elf 0x1234abcd

查看使用方法:man 1 addr2line

我们可以使用脚本封装该模块成backtrace.sh脚本,可以做到直接方便调用

#!/bin/bash

usage() {
    echo -e "Usage :"
    echo -e "   $0 [log file] [out file]"
    echo -e "   log file: error dump log file"
    echo -e "   out file: .out execute file"
    echo -e ""
    echo -e "example:"
    echo -e "   $0 stack.txt ht_cco.out"
    echo -e ""
}

if [ ! -n "$1" ]; then
    usage
    exit
fi

if [ ! -n "$2" ]; then
    usage
    exit
fi

STACK_FILE=$1
OUT_NAME=$2

tail -n 1000 $STACK_FILE | awk '{print $2}' | grep "0x[0-9A-Fa-f]*" | \
xargs riscv64-unknown-elf-addr2line -f -e $OUT_NAME

把异常模式下得到的log文件与ai.elf放入一起,执行脚本,如如: ./backtrac.sh crash5.txt ai.elf

可以得到大概信息为memcpy导致。

截图来源WQ5007 SDK user guide_CN_V1.1.pdf

第二种:objdump反汇编栈回溯

反汇编,查看汇编代码,对于可执行文件elf,第一列为其虚拟内存地址。

用法示例:

如果执行时候报错“objdump: can't disassemble for architecture UNKNOWN!”

使用objdump -i来查看支持的architecture, 找到合适的文件格式,执行例如:objdump -m i386 -d ai.elf ,没有合适的,那么可以换台机器。

鉴于dump文件过大,可以使用重定义到文件中再查看定位更加方便;

objdump -m i386 -d ai.elf > a.c

在dump文件中,我们查看前面异常寄存器中的ra寄存器的栈虚拟内存地址找到大概文件位置。

再查看PC寄存器的虚拟内存地址,根据dump中信息找到大概位置为memcpy导致

根据上面信息crash信息mcause: 0x03了解为零地址访问可以确定是在FaceRegister类中的memcpy函数的空指针导致crash,即可确认问题所在。

第三种:使用jtag

需要保留现场实时调试栈内存回溯确认位置,暂未实践,后续更新

第四种: readelf

读取elf的相关信息,如段信息。

如果想dump某些段内的信息,可以通过readelf -x 来hex-dump 或者通过readelf -p来string-dump,比如c/c++内的string literals

经过编译可能会存放在.rodata 只读数据段内,可以通过readelf -p .rodata xxx.elf > your outputfile 来dump

暂未实践,后续更新

程序的函数调用栈结构(从main函数到bar函数)

arm、risc-v架构异常寄存器概念

FP:栈顶指针,指向一个栈帧的顶部,当函数发生跳转时,会记录当时的栈的起始位置。

SP:栈指针(也称为栈底指针),指向栈当前的位置,

LR:链接寄存器,保存函数返回的地址。(在risc-v架构中,ra寄存器就相当于lr的作用)

 RV64G的32个通用寄存器(寄存器的宽度都是64位)

FP的作用

关于APCS(ARM Procedure Call Standard,ARM 程序调用标准)的说法 ,

除非子程序没有修改链接寄存器,否则FP都需要记录有效的栈帧位置

其寄存器(r11或者x29)不能被用做一个通用型的寄存器

FP的主要作用就是用来栈回溯,找到子程序的调用关系,也成为backtrace,当然一级一级的子程序调用时,FP的记录也在变化,也会一级一级的保存到栈中,最后通过FP的值来反推出一级一级的调用关系。

R13/SP的作用

sp 为栈指针,通过push pop 实现对栈存储的访问,栈主要是用来存储局部变量 中间值 等数据,同样和全部变量等存储的区域一样,也是一块memory,没有任何区别,只是使用的方式不一样。

LR的作用

LR为程序跳转时需要用到的寄存器,用来保存返回地址(同时也包含异常返回地址)。

程序经常会存在调用关系,当程序执行完子程序之后,肯定会返回到主程序,这是返回到主程序的地址就是在LR保存。

在一些CorteM系列的处理,LR的第0位会置1 表示,表示Thumb状态。

当然没有LR这个寄存器也可以的,直接将返回地址保存到栈中,最后执行完之后弹出到PC也行,但是寄存器的访问速度可以远高于栈(存储器SRAM),所以LR的作用还是很明显的。

此外对应ARMv8系列,还有ELR寄存器,对应的是异常状态下的返回地址。

借鉴文章部分知识点链接:ARM学习(1) 寄存器的理解 ===》FP、SP、LR寄存器_张一西的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/961899.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EXD 设计访谈|Vol.1 从“组件容器”聊到 B 端设计师的价值自证瓶颈

主持:元宝|嘉宾:赫本 《EXD 设计访谈》是由 EXD(易知微用户体验设计团队)制作的一档设计聊天栏目,主要和你分享我们在易知微这家公司里,关于 B 端工具设计、可视化内容设计、ToB 品牌运营设计方…

综合实训-------成绩管理系统 V1.1

综合实训-------成绩管理系统 V1.1 1、一维数组数据double 2、我们用元素的位置来当学号。 1、录入数据 【5个数据】或【通过文件的方式取数据】 2、显示数据 3、添加一条记录 4、修改一条记录 5、删除一条记录 6、查找一条记录。【输入学号,显示成绩】 7、统计。【…

StopWatch如何快速使用?

StopWatch如何快速使用? import org.springframework.util.StopWatch; public class StopWatchExample {public static void main(String[] args) {//创建stopWatch对象StopWatch stopWatch new StopWatch();// 开始计时 代码片段 起名task1stopWatch.start("…

运行速度高达1.8GHz可编程采集网关

今天介绍下BL304这个设备。嵌入式ARM控制器BL304系列是一款专为工业控制领域设计的坚固型工控设备。它采用NXP公司的处理器I.MX8M Mini四核64位处理器,搭配四核 Cortex-A53单核Cortex-M4构架,运行速度高达1.8GHz,具有高度的稳定性和可靠性。 …

Docker环境搭建Prometheus实验环境

环境: OS:Centos7 Docker: 20.10.9 - Community Centos部署Docker 【Kubernetes】Centos中安装Docker和Minikube_云服务器安装docker和minikube_DivingKitten的博客-CSDN博客 一、拉取Prometheus镜像 ## 拉取镜像 docker pull prom/prometheus ## 启动p…

【重要】NAND Flash基础知识简介

NAND Flash是一种非易失存储介质(掉电后数据不会丢失),常见的U盘、TF卡/SD卡,以及大部分SSD(固态硬盘)都是由它组成的。 本文主要介绍其组成及工作原理。 为了表述方便,后面所说的Flash仅指NAN…

folium 地图加载速度提升让加载速度飞起来 加载本地资源

背景 去年写了篇关于如何让folium生成的html地图加载速度飞起来的笔记,笔记中提到解决问题的思路是对html文档中的js/css资源的引用进行本地化替换,并给出了本地化资源,以及资源替换的处理函数。但没有展示这个方法处理带来的效果。 基于以…

数字人创作+SadTalker+GTX1080

https://github.com/OpenTalker/SadTalker 开源项目 SadTalker模型是一个使用图片与音频文件自动合成人物说话动画的开源模型,我们自己给模型一张图片以及一段音频文件,模型会根据音频文件把传递的图片进行人脸的相应动作,比如张嘴&#xf…

线上批量查询物流导出到表格的操作指南

现在的生活中,我们经常需要查询包裹物流信息。如果一次性需要查询多个快递单号的物流信息,手动一个一个查询会非常麻烦。今天,我将向大家分享一个简单实用的方法,可以批量查询物流并导出到表格,方便随时查看。 首先&am…

AP51656 PWM和线性调光 LED车灯电源驱动IC 兼容替代PT4115 PT4205

产品描述 AP51656是一款连续电感电流导通模式的降压恒流源 用于驱动一颗或多颗串联LED 输入电压范围从 5V 到 60V,输出电流 可达 1.5A 。根据不同的输入电压和 外部器件, 可以驱动高达数十瓦的 LED。 内置功率开关,采用高端电流采样设置 …

【AWS】实操-保护 Amazon S3 VPC 终端节点通信

文章目录 实验概览目标实验环境任务 1:探索并启动实验环境任务 1.1:探索 Amazon VPC 资源任务 1.2:探索 Amazon EC2 资源任务 1.3:创建 Amazon VPC 终端节点任务 1.4:连接私有 EC2 实例任务 1.5:探索 Amazo…

在win上,使用命令关闭占用端口号的进程

假设在 Windows 10 上,你可以使用以下命令关闭占用端口号为6200的进程: 打开命令提示符或 PowerShell 终端。 运行以下命令以查找占用端口号为6200的进程的 PID: netstat -ano | findstr :6200在输出中,找到占用端口号为6200的…

金蝶云星空二开,插件查看工具

可查询单据上挂载的系统原有插件、二开插件及插件类型 1.支持模糊查询单据列表 2.支持项目与账套二开插件对比 3.支持金蝶不同账套之间对比差异 操作步骤: 1.登陆界面,选择金蝶云管理中心账套登录获取账套列表; 2.单一标识查询:…

【Vue3】组件递归

【Vue3】组件递归 实现效果 通过传入一个数字&#xff0c;实现数字次循环 父组件 <script setup> import { ref } from "vue"; import RecursionMe from "./components/RecursionMe/index.vue";const level ref(0);const add () > level.val…

Unity 切换场景后场景变暗

问题 Unity版本&#xff1a;2019.4.34f1c1 主场景只有UI&#xff0c;没有灯光&#xff0c;天空盒&#xff1b;其他场景有灯光和天空盒所有场景不烘焙主场景作为启动场景运行&#xff0c;切换到其他场景&#xff0c;场景变暗某一个场景作为启动场景运行&#xff0c;光影效果正…

建筑工程数据处理的重要性有哪些?

建筑工程的数据非常复杂&#xff0c;数据处理也是非常重要的。它可以提高工程效率和质量&#xff0c;能够为决策者提供依据。那对于建筑工程来讲&#xff0c;数据处理重要性有哪些&#xff1f; 1.提高数据准确性 建筑工程数据处理需要准确无误&#xff0c;避免出现措施以及出现…

内网隧道代理技术(十八)之 上线不出网机器

上线不出网机器 不出网机器介绍 上线不出网机器是我们常见的问题&#xff0c;如何在内网中实现不出网机器的上线呢&#xff0c;我们分为了如下的形式&#xff0c;根据之前所学的内容我们开始进行实验&#xff0c;常见的网络拓扑如下&#xff1a; 一般渗透的场景是这样的&…

瑞芯微:基于RK3568得人脸朝向检测

驾驶员监控系统是基于驾驶员面部图像处理来研究驾驶员状态的实时系统。首先挖掘出人在疲劳状态下的表情特征&#xff0c;然后将这些定性的表情特征进行量化&#xff0c;提取出面部特征点及特征指标作为判断依据&#xff0c;再结合实验数据总结出基于这些参数的识别方法&#xf…

AttributeError: ‘Upsample‘ object has no attribute ‘recompute_scale_factor‘

原因 pytorch版本问题 解决办法 顺着路径找到文件upsampling.py并打开&#xff0c;修改里面的代码即可解决&#xff0c; 这个方式不需要重新安装pytorch YOLOV5 训练好模型测试时出现问题&#xff1a;AttributeError: ‘Upsample‘ object has no attribute ‘recompute_sc…

多路波形发生器的控制

本次波形发生器&#xff0c;主要使用运算放大器、NE555以及一些其他的电阻电容器件来实现。整体电路图如下所示&#xff1a; 产生的三角波如下&#xff1a; 正弦波如下 方波如下&#xff1a; 运算放大器&#xff08;Operational Amplifier&#xff0c;简称OP-AMP&#xff09;是…