IOS崩溃文件符号化实践

news2024/11/16 1:56:19

1.背景与项目难点

1.1 背景

由于公司之前使用的友盟要收费,filebase服务由谷歌提供,存在数据合规风险。需要实现稳定性分析功能,通过支持app崩溃信息实时采集、实时上报、实时自动解析并定位出代码问题,帮助研发同学及时定位崩溃原因并修复;同时对崩溃信息进行统计和可视化展示,通过数据辅助研发和PM同学进行产品功能迭代决策。

1.2 难点

ios端崩溃文件未经符号化且端上无法直接将符号化后的文件上传发送到服务端, 因此需要设计一套自动流程采集打包产生的dsym,实时采集ios上报后的崩溃文件,文件符号化后存储崩溃数据,对崩溃信息进行统计和可视化展示,在稳定性分析模块以供数据研发定位代码问题和PM进行产品功能迭代。

2. crash日志的分析与收集

2.1 如何获取dsym文件

dysm生成:dsym文件在触发打包过程中生成,生成后的文件存储在打包机上,因此第一步是将打包机上的dsym文件发送到崩溃解析服务器上。

2.1.1 初始方案

采用ftp文件传输,编写python脚本,在打包过程生成dsym文件后,发送到崩溃解析服务器。

产生问题:

由于公司使用的ios打包机安装在一台mac电脑上,mac电脑所在的集群网络和崩溃解析服务器所在的集群网络不通,且无法将mac电脑加入到崩溃解析服务器所在的集群,通过ftp方式上传文件无法满足此需求。因此需要引入中间文件存储工具,使用http的方式将文件上传到崩溃解析服务器上。

2.1.2 file browser引入

file browser:https://github.com/filebrowser/filebrowser
file browser可以创建属于自己的云的软件,可以在其中将其安装在服务器上,将其定向到一个路径,然后通过一个 Web 界面访问您的文件。filebrowser 提供指定目录下的文件管理界面,可用于上传、删除、预览、重命名和编辑文件。它允许创建多个用户,每个用户可以有自己的目录。它可以用作独立的应用程序。

基于filebrowser的以上功能,在崩溃解析服务器上安装filebrowser,用于保存dsym文件和crash文件。
在这里插入图片描述

2.1.3 最终方案

将filebrowser安装在崩溃解析服务器上,通过http请求filebrowser提供的上传文件接口,将打包上增加python脚本,生成的dsym文件后,调用filebrowser上传文件接口发送到崩溃解析服务器。

2.2 崩溃解析流程

2.2.1获取dsym文件流程

请添加图片描述

打包机将文件上传到崩溃解析服务器的具体流程为:
1.打包触发python脚本,通过脚本将dsym文件发送到崩溃解析服务器内的filebrowser
2.启动watch dog监听文件变更,监听到创建新的dsym文件,解析出dsym的uuid,并将文件发送到dsym存储表,以供展示平台可视化展示。

2.2.2 crash文件上报过程

请添加图片描述
1.crash信息通过SDK上报到埋点平台,我们通过Flink监听到crash信息的上报,flink任务将crash文件并把它写入数据库。
2.Flink是实时计算平台提供的用来实时消费上报的数据的程序,支持大并发量的数据。

2.2.3 分析crash文件方法

crash日志结构

基本信息
请添加图片描述

崩溃原因
请添加图片描述

线程
请添加图片描述
Binary Images
请添加图片描述

分析crash日志的方法symbolicatecrash

需要文件
1.有crash崩溃文件
2.有app.dsym文件
需要软件
Xcode
执行命令
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash yourCrashLog.crash yourAppName.app.dSYM > outputFileName.txt

2.2.4 符号化过程

请添加图片描述
1.客户端通过sdk上报crash文件到埋点服务器
2.埋点服务器将未符号化的crash文件存放到filebrowser中
3.运行在崩溃解析服务器上的watchdog监听到有新的crash文件创建,则去匹配和crash文件版本一致&uuid一致的dsym文件,执行symbolicatecrash解析命令
4.将符号化以后的文件存储在filebrowser并且发送到flink任务
5.flink任务将crash数据存入埋点数据库
6.可视化平台对崩溃数据查询

至此,符号化解析过程完毕,该方案在开发和测试过程中还暴露出一些问题

  1. 崩溃解析服务器的macos环境是由虚拟机搭建,开发过程中会出现由于macos系统版本的问题,导致crash文件解析失败,后续更换macos版本问题解决,但不确定该问题是否会随着xcode版本升级或者ios系统版本升级等变化再次出现。
  2. crash文件解析还需维护系统符号表,由于崩溃解析服务器存储空间限制,目前仅维护用户使用量较高的几个版本,并且目前系统符号表只能由人工上传维护。

3.总结

至此,我们完成了从crash文件上传、符号化解析到最终可视化界面平台展示的全流程的设计。
有了此功能,能够极大的提高了研发排查、解决线上问题的效率,提升了App的稳定性,也能够帮助PM进行产品功能迭代。

参考
简述分析crash日志的方法之symbolicatecrash
iOS 用symbolicatecrash符号化崩溃日志中系统库方法堆栈

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

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

相关文章

Java 布隆过滤器

你在么?在!一定在么?不在!一定不在么? 你想要100%的准去性,还是99%的准确性附带较高的速度和较小的资源消耗。 任何算法,任何经营收到的背后,都是时间效益 资源消耗 准确性的平衡&am…

ASO优化之如何更新APP

ASO是一个持续的迭代过程,应用商店排名和热门关键词每天都在变化,为了跟上应用行业快节奏的性质,我们必须灵活地制定应用商店的优化策略,并时常的更新我们的应用。 那我们该如何做到这一点呢? 如果是刚上新的应用&am…

93.【Vue-细刷-02】

Vue-02(十六)、基本列表渲染 (v-for)1.使用v-for遍历数组2.使用v-for遍历对象3.使用v-for遍历字符串(十七)、列表过滤 (filter())1.⭐JS中Change属性的原生状态⭐2.使用watch监听实现3.const {xxx} this 在Vue的作用⭐⭐4.JS箭头函数参数的简写⭐5.使用computed进行计算实现(最…

15_FreeRtos计数信号量优先级翻转互斥信号量

目录 计数型信号量 计数型信号量相关API函数 计数型信号量实验源码 优先级翻转简介 优先级翻转实验源码 互斥信号量 互斥信号量相关API函数 互斥信号量实验源码 计数型信号量 计数型信号量相当于队列长度大于1的队列,因此计数型信号量能够容纳多个资源,这在…

家庭理财,轻松记账修改收支记录这样操作

我们在记账的时候难免会出现记错或者想修改的地方,又或者是想将之前太久没有用的记账记录删除掉,今天,小编就教大家如何修改收支记录,一起接着往下看吧! 第一步,运行【晨曦记账本】在软件主界面中&#xff…

分享111个HTML娱乐休闲模板,总有一款适合您

分享111个HTML娱乐休闲模板,总有一款适合您 111个HTML娱乐休闲模板下载链接:https://pan.baidu.com/s/1mqmJLctj9oQbJt6Oo8IuBA?pwdep3t 提取码:ep3t Python采集代码下载链接:采集代码.zip - 蓝奏云 响应式美容养生服务行业…

Yolo系列之YOLOv1 YOLOv2

一、YOLOv1 1. YOLOv1概述 YOLOv1是单阶段目标检测方法,不需要像Faster RCNN这种两阶段目标检测方法一样,需要生成先验框。Yolo算法采用一个单独的CNN模型实现end-to-end的目标检测。虽然Faster-RCNN在当时是mAP最高的算法(2015-2016年), 然而速度却很慢,相对而言,Yol…

Java智慧校园平台源码:SaaS模式智慧校园运营云平台源码

校班务管理:评价管理: 1.web端/教师端小程序编辑点评 多元化评价,捕捉学生闪光点全方位评价,自定义评价类型、 评价信息实时推送至家长、AI智能点评 班级报表一键导出,智能评测学生在校表现,老师、家长实…

算法的时间复杂度

算法在编写成可执行程序后,运行时需要消耗时间资源和空间(内存)资源,因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的。 时间复杂度主要衡量一个算法运行的快慢,而空间复杂度主要衡量一个算法运…

Qt Desginer布局方法

首先将我们需要的控件拖拽到一个合适的位置,该例子中用到了两个label,两个lineEdit和两个pushButton。 然后我们需要利用弹簧来控制控件到控件之间的距离以及控件到窗体边界的距离,因为这里只有一组控件(两个label,两个…

学板绘课程学费一般多少钱

学板绘课程学费一般多少钱?培训机构的费用和师资、模式有关,价格贵不贵要结合相同类型的机构多多对比。因为好些平台做了很多的宣传广告,运营成本很高, 终羊毛出在羊身上,这样的机构知名度很高,但是性价比不…

untiy 录制网络摄像头视频并保存到本地文件

网络摄像头使用的是海康威视的,关于如何使用Ump插件播放海康威视rtsp视频流,请参考我的这篇文章 内部有ump插件的下载链接 untiy接入 海康威视网络摄像头 录屏使用的插件是 AVPro movieCapture 4.6.3版, 插件和完整工程的下载链接放在本文的…

eclipse创建第一个java web项目并运行

为了能编写java web项目,建议安装支持javaee开发的eclipse版本。1.下载eclipse地址:https://www.eclipse.org/downloads/packages/release/2021-03/r2.解压后启动eclipse3.新建java web工程设置项目名称,指定tomcat的版本及路径4. 添加一个js…

Python快速入门系列之一:Python对象

Python对象1. 列表(list)2. 元组(tuple)3. 字典(dict)4. 集合(set)5. 字符串(string)6. BIF (Built-in Function)7. 列表、集合以及字…

小笔记:gitlab配置文件 /etc/gitlab/gitlab.rb 配置项

小笔记:gitlab配置文件 /etc/gitlab/gitlab.rb 配置项CSDN账号 jcLee95 :https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/12…

0.3调试opencv源码的两种方式

调试opencv源码的两种方式 上两篇我们分别讲了如何配置opencv环境,以及如何编译opencv源码方便我们阅读。但我们还是无法调试我们的代码,无法以我们的程序作为入口来一步一步单点调试看opencv是如何执行的。 【opencv源码解析0.1】VS如何优雅的配置ope…

Python学习-----模块1.0(模块的简介、定义与使用)

目录 前言: 1.什么是模块 2.模块的分类 (1)内置模块 (2)第三方模块 (3)自定义模块 3.模块的使用 4.自定义模块 5.模块和执行文件的判断 前言: 今天就开始讲Python中的模块篇…

第07章_单行函数

第07章_单行函数 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. 函数的理解 1.1 什么是函数 函数在计算机语言的使用中贯穿始终,函数的作用是什么呢?它可以把我们经…

netty心跳

为什么要引入心跳机制:因为网络连接是不可靠的,像在TCP长连接或者webSocket长连接时都会使用心跳机制,即发送特殊的数据包告诉自己的业务没办完,不要关闭连接。案例要求:当服务器超过3秒没有读时,就提示读空…

二维数组中的查找(两种解法,各有千秋)

凡事都有可能,永远别说永远。——《放牛班的春天》今天一题为再一个行列都有序的二维数组中寻找一个目标值,我们第一时间想到的可能是很暴力的解法,例如从头到尾进行遍历,这样能做出来,但是借用武忠祥老师的一句话&…