浅谈移动端的崩溃分析

本文涉及的产品
数据安全中心,免费版
日志服务 SLS,月写入数据量 50GB 1个月
简介: 介绍iOS,Android移动端的崩溃分析的基本原理与实现方式。

一、前言

   关于移动端的崩溃分析的必要性,我们知道移动端有以下特性,终端分布广,出问题后不易定位,日志收集需要额外处理,版本本更新,跟前端,后端比起来,周期会长很多,虽然也有相应的热更新手段,在苹果的审核机制面前,也只能认怂。种种条件对移动端软件质量的要求较高,同时还要求有远程收集日志并分析的能力。一般崩溃发生后,程序员的第一反应肯定是:在我这好好的,肯定不是我的问题,不信我拿日志来定位一下,于是千辛万苦找出用户日志,符号表,提取出崩溃堆栈,拿到了下面的结果:

addr2line-ipfCelibxxx.so007da904007da9db007d789500002605007dbdf1logging::Logging::~Logging() LINE: logging.cc:856logging::ErrLogging::~ErrLogging() LINE: logging..cc:993base::internal::XXXX::Free(int) LINE: scoped____.cc:54base::___Generic<int, base::internal::_____loseTraits>::_____sary() LINE: scoped_______.h:153base::___Generic<int, base::internal::_____loseTraits>::_____eric() LINE: scoped_______.h:90

如果是接入了某些崩溃分析平台,还能实时发出告警,你一点开就看到程序蹦在哪了,影响了多少用户等等,如下图


   看了这个,恍然大悟,原来是这一行写的有问题。这是移动端的常用的崩溃分析过程,不管是开发哥哥人肉去看还是通过各种平台查看,那其中原理是什么呢?下面我们简单了解一下。


二、原理

我们了解原理前,先了解一下符号表是什么。    符号表是记录着地址或者混淆代码与源码的对应关系表。下面我们分别用一个小demo程序来讲解符号表及反解的过程。

2.1 iOS-OC、Android-SO符号化原理

a.示例源码:

intadd(){
inta=1;
a++;
intb=a+3;
returnb;
}
intdiv(){
inta=1;
a++;
intb=a/0;                //这里除0会引发崩溃returnb;
}
int_tmain(intargc, _TCHAR*argv[]){
add();
div();
return0;
}

b.对应符号表,这里简化了符号表,没带行号信息

0x00F913B0~0x00F913F0add()
0x00F91410~0x00F91450div()
0x00F91A90~0x00F91ACD_tmain()

c.现有一崩溃堆栈

0x00F9143A0x00F91AB0

d.进行符号化

0x00F9143A0x00F91AB0

2.2 Android-Java 符号化原理

a.示例源码:

packagecom.aliyun.gts.testclassUser{
intcount;
UserDTOuserDto;
UserDTOget(intid){...}
intset(UserDTOuserDto){...} 
}
classUserDTO{
intid;
Stringname;
}

b.符号表

com.a.b.c.d->com.aliyun.gts.test.Userintcount->acom.aliyun.gts.test.UserDTO->bcom.aliyun.gts.test.UserDTOget(int) ->cintset(com.aliyun.gts.test.UserDTO) ->dcom.a.b.c.e->com.aliyun.gts.test.UserDTOintid->aStringname->b

c.现有一崩溃堆栈

com.a.b.c.d.d(com.a.b.c.e)

d.进行符号化

//符号化com.a.b.c.d.d(com.a.b.c.e)    //查找com.a.b.c.d, 命中com.aliyun.gts.test.User//查找com.aliyun.gts.test.User.d 命中 set()//查找com.a.b.c.e,命中 com.aliyun.gts.test.UserDTO//符号化结果为com.aliyun.gts.test.User.set(com.aliyun.gts.test.UserDTO) 


三、如何为自己的应用选择方案

可以分成以下四种方案:开发人肉分析、使用其他公司的开放平台、私有化部署、自建平台;

3.1 开发人肉分析

如果应用使用场景不高,或以选择由开发人肉进行分析,但是符号表的管理工作也会随着版本越来越多而增加,符号化的成本也因此会不断增加。

3.2 使用其他公司的开放平台

当前也有较多的公司提供崩溃分析服务,直接接入对应的SDK就可以,可以利用平台的能力进行快速的崩溃分析,平台的收费也各式各样,还有些是免费的服务,对于数据安全要求较低的产品,可以考虑此方案。

3.3 私有化部署

如果对数据安全要求较高,但是又没研发力量自己开发一套,可以考虑买一些公司的私有化部署方案,把整个服务部署在自己的集群里,可以保证数据安全,当然费用上会比直接使用公网的平台高许多,但也会比自建平台的成本低一些。

3.4 自建平台

如果公司自有Devops中台团队,且对数据安全要求较高,可以考虑自建崩溃分析平台,但在日志收集、符号解析、数据聚合等方面需要较多的精力去建设,需要考虑投入产出比的,最后还需要部署到自己的集群上,整体的成本是比较高的。


四、总结

本文从原理上简单描述了移动端崩溃分析,给移动端开发者一个思路与建议,开发者可以根据自己的应用场景,选择适合自己的崩溃分析方式。

相关文章
|
6天前
|
消息中间件 缓存 网络协议
系统卡顿分析
系统卡顿分析
|
5月前
|
移动开发 监控 Android开发
几个系统级崩溃问题和h5加载页面崩溃问题及解决方案
几个系统级崩溃问题和h5加载页面崩溃问题及解决方案
122 0
|
5月前
|
监控 JavaScript C++
监控游戏c/c++的崩溃的解决方案
监控游戏c/c++的崩溃的解决方案
94 0
|
iOS开发 索引 容器
iOS 崩溃分析详解和防护处理
iOS 崩溃分析详解和防护处理
iOS 崩溃分析详解和防护处理
|
Java Android开发
安卓跳转到新活动时加载视图,再加载数据。预防崩
安卓跳转到新活动时加载视图,再加载数据。预防崩
113 0
|
运维 监控 前端开发
微信团队分享:微信后台在海量并发请求下是如何做到不崩溃的
本文分享了微信基于大规模微服务架构的后台过载管控和保护策略,以及微信根据IM业务特点的一些独特的架构设计做法,其中很多方法很有借鉴意义,值得一读。
437 0
微信团队分享:微信后台在海量并发请求下是如何做到不崩溃的
|
缓存 UED
语音直播系统源码, 程序运行缓慢的主要原因分析
语音直播系统源码, 程序运行缓慢的主要原因分析
|
监控 JavaScript 前端开发
应用性能管理—uniapp移动端崩溃
本案例是为我校订制的智慧校园APP,由于我校并没有官方的校园APP所以导致学生需要频繁登陆教务系统网站,且因本校教务系统网站对移动端的兼容不是很完善,所以导致部分信息无法清晰查看,基于此,本项目应运而生。在开发工具方面,选择了使用uniapp,uniapp是一个使用Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/QQ/快手/钉钉/淘宝)、快应用等多个平台。这能为我们大幅度减少开发时间,提高开发效率。
应用性能管理—uniapp移动端崩溃
|
监控 搜索推荐 算法
启动、内存、卡顿三大分析,用户体验就用它?
启动分析支持通过预置采集和个性化自定义两种方式定义启动阶段,可以分别查询首次启动、冷启动、热启动的情况效果,并可以与设备、系统、版本、地域等维度做交叉筛选查询。U-APM的内存分析提供线上OOM异常的监控与分…
启动、内存、卡顿三大分析,用户体验就用它?
|
运维 监控 算法
优酷技术实践:自动检测及修复视频播放异常
音视频播放器的工作内容可以描述为:根据流媒体协议还原音视频内容的过程。在还原的 每个阶段都存在丢失精度的风险,而最终呈现的结果也是一个主观的内容,这就给播放器输出结果的评估引入了一些痛点问题。
优酷技术实践:自动检测及修复视频播放异常