Android使用addr2line分析Native Crash

news2024/9/22 17:22:32

NDK提供的工具将函数地址解析为具体的函数名和行数才能进一步分析问题。

常用的地址转换工具有addr2line、ndk-stack等,个人比较喜欢addr2line,所以接下来介绍下该工具的基本使用方式

日常使用过程中,只需要关注-C -f -e三个参数即可

// -C: Demangle函数名
// -f: 显示函数名
// -e: 带符号表的so路径

这里展开说说-C这个参数,我们知道C/C++语言在编译以后,函数的名字会被编译器修改为编译器内部识别的名字,该名字在链接的时候被用到。将C++源代码转换为C++ ABI标识符的过程称为mangle,相反的过程称为demangle

以Linux下的g++为例,每个方法都以_Z开头,比如_Z3foov就是函数foo(),v表示参数类型为void。从foo()转换为_Z3foov的过程被称为mangle,_Z3foov转换为foo()的过程被称为demangle。

其中NDK中的aarch64-linux-android-c++fil(和addr2line同一个目录)是专门用来支持Demangle的

新建一个带C++的Android Studio工程,主动创造一个native crash

启动app后如预期崩溃

抓到崩溃信息后,根据ABI找到相对应的addr2line工具和带符号表的so文件。

我们主要关注backtrace后面的信息,同时带"pc"和"/data"的行基本就是app相关的崩溃行了

除了最后一个是被strip了符号的so,前三个so文件都是可以的

终端中使用addr2line转换地址

aarch64-linux-android-addr2lin -C -f -e ${SO_PATH} ${Address} ${Address} ...

 

解析结果

定位到具体的函数名和行数后就可以进一步排查问题了

Crash堆栈解析脚本

日常工作或者学习中还是使用一个python脚本来解析带crash堆栈的文件比较方便

#!/usr/bin/python
import sys
import re
import os

ADDR2LINE_PATH ='your tool abs path'

if len(sys.argv) >= 3:
    SO_PATH = sys.argv[1]
    FILE_PATH = sys.argv[2]

CMD_BASE = ADDR2LINE_PATH + ' -C -f -e ' + SO_PATH + ' '
with open(FILE_PATH, 'r') as f:
    for line in f:
        crash = re.search('#[0-9]+ +pc +([0-9A-Fa-f]+) +/data', line)
        if crash is not None:
            addr = crash.groups(1)[0]
            cmd = CMD_BASE + addr
            res = os.popen(cmd).read()
            print(res)

使用效果

 

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

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

相关文章

LaViT:这也行,微软提出直接用上一层的注意力权重生成当前层的注意力权重 | CVPR 2024

Less-Attention Vision Transformer利用了在多头自注意力(MHSA)块中计算的依赖关系,通过重复使用先前MSA块的注意力来绕过注意力计算,还额外增加了一个简单的保持对角性的损失函数,旨在促进注意力矩阵在表示标记之间关…

注意力机制(Attention mechanism)(中篇)

模型的输入是一组向量,它可以是文字,可以是语音,可以是图。而输出有三种可能性, 第一种可能性是每一个向量都有一个对应的标签。如图1所示,当模型看到输入是4个向 量的时候,它就要输出4个标签。如果是回归问…

React项目通过jsmind实现思维导图以及相关功能

jsMind jsMind 是一个用于显示和编辑思维导图的纯 JavaScript 类库。它基于 Canvas 和 SVG 进行设计,能够在现代浏览器中高效地运行。jsMind 以 BSD 协议开源,这意味着可以在遵守该协议的前提下,将其嵌入到任何项目中使用。 功能特点 jsMi…

从0到1搭建用户管理系统

手把手教你搭建前后端框架 新手对于很多成熟框架,不知道如何搭建的,不知道如何实现等等,忙碌之余,写了一篇博客 手把手教你搭建前后端框架源码, springbootmysqlelementuivue 从0到1,搭建springboot框架&am…

windows下mysql启动失败无报错(已解决)

环境:win server 2012R2 mysql版本:8.0 今天使用net stop mysql;net start mysql进行重启,发现重启失败,而且提示服务没有任何错误。 接着就检查了所有的常见问题(如端口占用、配置文件路径错误等)仍然无…

024、架构_资源_主机

摘要 在主机管理界面,可查看 GoldenDB 使用的主机信息,可对主机执行新增、编辑、删除操作。 主机列表 选择菜单[资源管理→主机管理],进入主机列表界面。 新增主机(单个、批量) 新增主机流程: 添加

hexo d 报错

上学期四月份左右用hexogithub搭了一个简单的博客,开学回来发现运行hexo d就报错,试了好几种网上的方法解决。(虽然好使了,但还是没弄明白啥原理,难道是token过期就不好使吗?) 奇妙的解决方案 …

WD100电磁铁-国家实验室方案

根据合肥国家实验室磁场要求,上海天端实业有限公司设计制造WD100电磁铁,参数如下 水冷WD100电磁铁参数资料 产品规格 水冷型WD-100型电磁铁,卧式座放,磁场方向水平; 气隙双向可调,可调范围0-100mm&am…

【GeoScenePro】Generic Server Error

错误 解决方案 在portal中进行知识图谱许可授权

C语言指针进阶一:(字符指针,数组指针,指针数组,函数指针)

字符指针 在指针类型中我们知道字符指针类型,一般就是用于 char 的: int main() {char ch w;char* p &ch;*p a;return 0;} 还有一种使用方法: int main() {const char* pstr "hello bit";printf("%s\n", p…

亚马逊、temu自养号采购大额下单需要解决哪些技术要点?

自养号采购下单在跨境电商平台中是一个复杂且需要精细操作的过程,主要涉及多个技术要点以确保账号安全、提高下单成功率,并避免被平台风控系统识别。以下是需要解决的关键技术要点: 1. 纯净的测评环境 服务器与IP:使用高纯净度的…

java实现发邮件功能的方式?如何使用java?

java实现发邮件的配置步骤?如何用java实现发信功能? Java实现发邮件功能是一个非常常见且重要的需求。无论是用于用户注册确认、密码重置还是系统通知,Java实现发邮件功能都能提供强大的支持。AokSend将详细介绍几种常用的Java实现发邮件功能…

模板方法详解

1.基本介绍 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern), 在一个抽象类公开定义了执行 它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。简单说&…

【系统分析师】-计算题-净现值与投资回报率

1、某企业准备开发一个信息管理系统,其生存周期为5年。该系统的预计开发成本、预计的年运行/维护成本,以及预计的收益如下表所示(其中带括号的数据表示负值)。 问题1 (1)目前许多管理人员将投资的净现值作为…

Ribbon负载均衡底层原理

springcloude服务实例与服务实例之间发送请求,首先根据服务名注册到nacos,然后发送请求,nacos可以根据服务名找到对应的服务实例。 SpringCloudRibbon的底层采用了一个拦截器,拦截了openfeign发出的请求,对地址做了修…

Qt 实现不规则的部件或者窗口

1、实现不规则的部件 1.1 工程目录 1.2 界面实现 1.3 widget.cpp #include "widget.h" #include <QPixmap> #include <QBitmap> #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->set…

AI人工智能_Prompt提示词工程如何生成API接口文档

AI人工智能_Prompt提示词工程如何生成API接口文档&#xff1f;在与AI大模型的交互中&#xff0c;每当我们输入一段文字&#xff0c;无论是问题、命令还是陈述&#xff0c;这段文字就是一个Prompt。 Prompt提示词工程&#xff08;Prompt Engineering&#xff09;是一种技术或方…

【C++】—— string 类的了解与使用

【CPP】—— string类的了解与使用 1、 为什么学习string 类1.1、 C语言中的字符串1.2、 面试题中更多以 string 类出现 2、 标准库中的 string 类3、 string 的默认成员函数3.1、 string 的构造与拷贝构造3.2、 string 的赋值重载3.3、 string 的析构函数 4、 operator[ ]4.1、…

ADAS---基于检测框的单目测距方法

1.1.模型求解法方法解读&#xff1a; Yolo模型可以输出被检测物体的置信度、类别及检测框的中心点坐标(xc,yc)及宽高(w,h)等信息&#xff0c;选取车辆检测框底部的中点作为距离测量的特征点&#xff0c;其计算公式如下&#xff1a; 车辆测距示意图如下&#xff1a; 图中&#…

Zabbix之ubuntu环境下最新版zabbix-server7.0安装

一、zabbix7.0简介 Zabbix 7.0 是 Zabbix 系列中的一个主要版本&#xff0c;提供了增强的监控功能、改进的性能和扩展的可用性。Zabbix 是一个开源的企业级监控解决方案&#xff0c;用于监控服务器、虚拟机、网络设备、应用程序、服务等各类 IT 基础设施。Zabbix 7.0 继承了之前…