Android使用addr2line分析Native Crash

news/2024/9/15 23:15:23/ 标签: android

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 osADDR2LINE_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 + addrres = os.popen(cmd).read()print(res)

使用效果

 


http://www.ppmy.cn/news/1520342.html

相关文章

浅析JVM invokedynamic指令和Java Lambda语法|得物技术

一、导语 尽管近年来JDK的版本发布愈发敏捷,当前最新版本号已经20,但是日常使用中,JDK8还是占据了统治地位。 你发任你发,我用Java8:【Jetbrains】2023 开发者生态系统现状 - https://www.jetbrains.com/zh-cn/lp/dev…

都2024年了你还缺客源?十分钟教你如何获取!

你是否还在为如何找到精准的客源而烦恼?别担心,今天我们就来分享一些客源采集方法,让你十分钟内掌握技巧,轻松获取全国各地各行各业的客源。 精准采集客源 1. 拓客工具 专业的拓客工具可以帮助你精准地采集到全国各地的客源信息。…

无人机之遥控器防水性能篇

无人机遥控器的防水性能是评估其耐用性和适应不同环境能力的重要指标。随着无人机技术的不断发展,越来越多的遥控器在设计时融入了防水元素,以满足用户在不同天气条件下的使用需求。以下是对无人机遥控器防水性能的详细探讨: 一、防水等级与…

Redis 入门到精通1

一、String(字符串) 特点: 最基本的数据类型,二进制安全,可以存储任何数据,比如图片或者序列化的对象。一个 key 对应一个 value。 常用命令及示例: SET key value:设置一个键值对。…

实战项目:俄罗斯方块(六)

文章目录 🍊自我介绍🍊图像界面绘制界面绘制界面显示代码运行结果 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏(一键四连)哦~ 🍊自我介绍 Hello,大家好,我是小珑也…

C语言典型例题60

《C程序设计教程(第四版)——谭浩强》 习题4.1 统计全单位人员的平均工资。单位的人数是不固定的,工资数从键盘先后输入,当输入-1时,表示输入结束(前面输入的都是有效数字)。 代码: //《C程序设计教程&…

论文《Improving your graph neural networks:A High-Frequency Booster》笔记

【CLAR 2022 ICDMW】作者指出,现有的GNN模型主要关注于消息传递机制,但这些模型往往受限于低通滤波器的局限,导致在多层堆叠时性能下降。为了解决这个问题,论文提出了一种新的正则化方法,称为补全拉普拉斯正则化&#…

三防平板:定制化服务的趋势——以智慧医疗为例

随着科技的飞速发展,三防平板产品凭借其坚固耐用、适应复杂环境的特性,在众多行业领域中崭露头角。而在AI迅速增长的今天,AI智慧医疗成为了一个备受关注的热点,它不仅推动了医疗行业的数字化转型,也为三防平板产品的定…

linux 硬件 arm架构 汇编语言

1.cortex 1. Cortex-A 低功耗 消费类 ARM Cortex-A 系列处理器是一种广泛应用于 移动设备、嵌入式系统和物联网的高效能处理器,因其低功耗和高性能的特点而受到青睐。 2. Cortex-R 实时性 Cortex-R处理器针对高性能实时应用,例如硬盘控制器(或…

挂载5T大容量外接硬盘到ubuntu

挂载5T大容量外接硬盘到ubuntu S1:查看硬盘 使用 $ sudo fdisk -l找到对应盘,例如下图所示 /dev/sdc S2: 创建分区 使用 $ sudo fdisk /dev/sdc对上硬盘进行创建分区;可以依次使用以下指令 m :查看命令; g &…

SQL 中 LIKE 和 REGEXP 的相同点与不同点解析

SQL 中 LIKE 和 REGEXP 的相同点与不同点解析 在数据库查询中,字符串匹配是非常常见的需求,而 SQL 提供了多种方式来实现这一功能,其中 LIKE 和 REGEXP 是两种常用的操作符。虽然它们都能用于字符串匹配,但它们在工作原理、匹配精…

前端面试:webSocket如何兼容低浏览器?

WebSocket 是一种用于全双工通信的协议,它可以在客户端和服务器之间建立持久的连接。尽管现代浏览器广泛支持 WebSocket,但对于一些低版本浏览器或不支持 WebSocket 的环境,我们需要考虑兼容性问题。以下是在低版本浏览器上兼容 WebSocket 的…

Hive Tutorial For Beginners

Hive Tutorial For Beginners 一、Hive历史(History of Hive) Facebook 在面对日益增长的大数据时,选择了 Hadoop 作为解决方案。 但问题在于,许多用户并不熟悉 Java 或其他编程语言,这使得使用 Hadoop 的 MapReduc…

EtherCAT 转 ModbusTCP 网关

设备简介 本产品是 EtherCAT 和 Modbus TCP 网关,使用数据映射方式工作。 本产品在 EtherCAT 侧作为 EtherCAT 从站,接 TwinCAT 、 CodeSYS 、 PLC等;在 ModbusTCP 侧做为 ModbusTCP 主站( Client )或从站…

揭秘推荐算法:深度学习如何读懂你的购物心思

时间:2024年09月03日 作者:小蒋聊技术 邮箱:wei_wei10163.com 微信:wei_wei10 音频:https://xima.tv/1_L8HH40?_sonic0 希望大家帮个忙!如果大家有工作机会,希望帮小蒋内推一下&#xff0c…

python判断语句(三)

下一篇持续更新中… 如有错误欢迎指正!!! 文章目录 前言学习内容 布尔类型和比较运算符布尔类型比较运算符总结 if语句的基本格式if语句的注意点总结案例 if else语句注意点总结案例 if elif else语句注意点总结案例 判断语句的嵌套语法格式…

【mysql】mysql目录结构和源码和mysql基础练习

mysql目录结构和源码的说明: 也就是之前说四个位置有提到的两个位置, 1软件安装位置bin 把bin目录加入环境变量就可以直接在命令行调用, "***\MySQL\MySQL Installer for Windows\bin" 2还有一个数据库文件的安装位置 &#…

PyTorch 2.4 import 报错问题解决

最近在新环境中安装了PyTorch 2.4版本,简单测试了import,发现直接报错: import torchA module that was compiled using NumPy 1.x cannot be run in NumPy 2.1.0 as it may crash. To support both 1.x and 2.x versions of NumPy, modules must be co…

Golang | Leetcode Golang题解之第381题O(1)时间插入、删除和获取随机元素-允许重复

题目: 题解: type RandomizedCollection struct {idx map[int]map[int]struct{}nums []int }/** Initialize your data structure here. */ func Constructor() RandomizedCollection {return RandomizedCollection{idx: map[int]map[int]struct{}{},}…

读写分离深度解析与MaxScale配置指南

读写分离介绍 读写分离是数据库架构中一项关键优化策略,它通过将数据库操作分为“读”和“写”两类,并分别部署到不同的服务 器集群上来实现性能提升和数据负载分散。在这种架构中,所有的写操作(如INSERT、UPDATE、DELETE等&#…