浅谈移动端的崩溃分析

本文涉及的产品
数据安全中心,免费版
日志服务 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中台团队,且对数据安全要求较高,可以考虑自建崩溃分析平台,但在日志收集、符号解析、数据聚合等方面需要较多的精力去建设,需要考虑投入产出比的,最后还需要部署到自己的集群上,整体的成本是比较高的。


四、总结

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

相关文章
|
2月前
|
测试技术 开发工具 git
写了BUG还想跑——闲鱼异常日志问题自动追踪-定位-分发机制
为了高效地发现、定位和解决预发问题,闲鱼团队研发了一套异常日志问题自动追踪-定位-分发机制。这套机制通过自动化手段,实现了异常日志的定时扫描、精准定位和自动分发,显著降低了开发和测试的成本,提高了问题解决的效率。
120 15
写了BUG还想跑——闲鱼异常日志问题自动追踪-定位-分发机制
|
2月前
|
运维 JavaScript jenkins
鸿蒙5.0版开发:分析CppCrash(进程崩溃)
在HarmonyOS 5.0中,CppCrash指C/C++运行时崩溃,常见原因包括空指针、数组越界等。系统提供基于posix信号机制的异常检测能力,生成详细日志辅助定位。本文详解CppCrash分析方法,涵盖异常检测、问题定位思路及案例分析。
68 4
|
3月前
|
消息中间件 缓存 网络协议
系统卡顿分析
系统卡顿分析
|
6月前
|
Arthas 数据采集 测试技术
性能优化思路及常用工具及手段问题之利用工具采集系统热点问题如何解决
性能优化思路及常用工具及手段问题之利用工具采集系统热点问题如何解决
|
6月前
|
移动开发 Android开发 iOS开发
探索安卓与iOS开发的差异:平台选择对应用性能的影响
在移动开发的广阔舞台上,安卓与iOS这两大操作系统各据一方,引领着技术潮流与市场需求。本文深入探讨了这两个平台在开发过程中的关键差异,并分析了这些差异如何影响应用的性能和用户体验。通过对比分析,我们将揭示开发者在选择平台时应考虑的技术细节,以及这些选择如何塑造最终产品的命运。文章不仅为开发者提供了实用的指导,也为那些对移动开发感兴趣的读者提供了深刻的洞见。
|
8月前
|
Android开发 容器
安卓和苹果页面和逻辑是否有必要追求百分之百统一
安卓和苹果页面和逻辑是否有必要追求百分之百统一
58 0
|
8月前
|
监控 JavaScript C++
监控游戏c/c++的崩溃的解决方案
监控游戏c/c++的崩溃的解决方案
122 0
|
存储 JSON 缓存
卡顿监测 · 方案篇 · Android卡顿监测指导原则(2)
卡顿监测 · 方案篇 · Android卡顿监测指导原则
184 0
卡顿监测 · 方案篇 · Android卡顿监测指导原则(2)
|
缓存 前端开发 Java
卡顿监测 · 方案篇 · Android卡顿监测指导原则
卡顿监测 · 方案篇 · Android卡顿监测指导原则
567 0
卡顿监测 · 方案篇 · Android卡顿监测指导原则
|
iOS开发 索引 容器
iOS 崩溃分析详解和防护处理
iOS 崩溃分析详解和防护处理
iOS 崩溃分析详解和防护处理

热门文章

最新文章