iOS Abort问题系统性解决方案

本文涉及的产品
移动研发平台 EMAS,开发者版免费套餐
简介: 本文将针对iOS客户端的Abort问题,进行根因定位分析,并提出系统性解决方案。

一、背景

崩溃(Crash),即闪退,多指移动设备(如iOS、Android设备)在打开/使用应用程序的过程中,突然出现意外退出/中断的情况。如果App线上版本频繁发生崩溃,会极大地影响用户体验,甚至导致用户流失,以及收益减少。因此,崩溃问题是客户端稳定性团队需要重点解决的问题。

然而,对于所有崩溃场景,仅25%的崩溃可通过信号量捕获,实施相应改进;另有75%的崩溃则难以识别,从而对App的用户体验,造成了巨大的潜在影响。
1111111.png

Facebook的工程师将App退出分为以下6个类别:
1.App内部主动调用exit()或abort()退出;
2.App升级过程中,用户进程被杀死;
3.系统升级过程中,用户进程被杀死;
4.App在后台被杀死;
5.App在前台被杀死,且可获取堆栈;
6.App在前台被杀死,且无法获取堆栈。

对于第1~4类退出,属于App的正常退出,对用户体验没有太大影响,无需进行相应处理;对于第5类退出,可通过堆栈代码级定位崩溃原因,对此业界已形成比较成熟的解决方案,推荐免费试用阿里云的崩溃分析服务,即可快速定位、解决此类崩溃问题;对于第6类退出,可能的原因很多,包括但不限于:系统内存不足时继续申请内存、主线程卡死20s以上、CPU使用率过高Stack Overflow等,在此我们统一称之为iOS客户端的“Abort问题”。

Abort问题无法被堆栈捕获,且发生频次远高于可被捕获的崩溃(下称“堆栈崩溃”)。从历史数据来看,手淘(电商类超级App代表)的Abort问题数量一般是堆栈崩溃数量的3倍左右;优酷Pad(视频类超级App代表)的Abort问题数量一般是堆栈崩溃数量的5倍左右。可见,Abort问题对用户的使用体验造成巨大影响。

本文将针对iOS客户端的Abort问题,进行根因定位分析,并提出系统性解决方案。

二、Abort问题的原因分类

形成Abort问题的原因主要包括以下4个。

2.1 内存Jetsam

移动端设备的物理内存资源紧张,但App仍不断申请内存。因此系统signal 9杀死进程,造成异常退出。

{   
"memoryPages" : {  
   "active" : 24493,  
   "throttled" : 0,  
   "fileBacked" : 24113,  
   "wired" : 13007,  
   "anonymous" : 12915,  
   "purgeable" : 127,  
   "inactive" : 10955,  
   "free" : 2290,  
   "speculative" : 1580  
},  
"uncompressed" : 125795,  
"decompressions" : 143684  
},  
"largestProcess" : "Taobao4iPhone",  
"processes" : [  
{  
...  
{  
   "rpages" : 2050,  
   "states" : [  
     "frontmost",  
     "resume"  
   ],  
   "name" : "Taobao4iPhone",  
   "pid" : 1518,  
   "reason" : "vm-thrashing",  
   "fds" : 50,  
   "uuid" : "5103a88a-917f-319e-8553-c0189dd1abac",  
   "purgeable" : 127,  
   "cpuTime" : 4.619693,  
   "lifetimeMax" : 3557  
},  
...  
}

2.2 主线程死锁

A/B两个线程同时等待对方完成某些操作,因而无法继续执行,形成死锁,造成异常退出。

Exception Type:  00000020
Exception Codes: 0x000000008badf00d
Highlighted Thread:  0
 
Application Specific Information:
com.myapp.myapp failed to scene-create in time
 
Elapsed total CPU time (seconds): 4.230 (user 4.230, system 0.000), 10% CPU 
Elapsed application CPU time (seconds): 1.039, 3% CPU
 
Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0:
0   libsystem_kernel.dylib          0x36360540 semaphore_wait_trap + 8
1   libdispatch.dylib               0x36297eee _dispatch_semaphore_wait_slow + 186
2   libxpc.dylib                    0x364077b8 xpc_connection_send_message_with_reply_sync + 152
3   Security                        0x2b8dd310 securityd_message_with_reply_sync + 64
4   Security                        0x2b8dd48c securityd_send_sync_and_do + 44
5   Security                        0x2b8ea452 __SecItemCopyMatching_block_invoke + 166
6   Security                        0x2b8e96f6 SecOSStatusWith + 14
7   Security                        0x2b8ea36e SecItemCopyMatching + 174

2.3 启动/重启超时

App由于启动/重启的时间超过系统允许的时间限制,造成异常退出。

scene-create watchdog transgression: app exhausted real (wall clock) time allowance of 19.93 seconds, Elapsed total CPU time (seconds): 21.050 (user 21.050, system 0.000)

2.4 CPU打爆

主线程死锁、启动/重启超时,都可能间接导致CPU打爆,造成异常退出。

三、Abort问题的根因定位

Abort问题常常没有明显线索进行问题定位,因此,解决难度比较大。手淘曾经历过很多次Abort问题数量飙升,但无从下手的事故,甚至还有一两次发生在双11前不久,但往往以“一群人苦逼的众测复现、复现之后也无法确定是否真的复现”收场。

因此,我们迫切需要基于已有经验,形成一套完整的解决方案,快速、准确地定位/解决问题。这就需要我们从以下几个方面着手进行考虑:
1.Abort问题发生的场景:例如,哪个页面、什么操作。
2.Abort问题发生的原因:例如,内存Jetsam、主线程死锁、启动/重启超时、CPU打爆。
3.对于内存Jetsam,需进一步定位到是否发生了内存泄露以及泄露的循环引用(Retain Cycle)。
4.对于主线程死锁,需进一步定位到卡死的堆栈。
5.对于启动/重启超时,以及CPU打爆,需进一步定位到堆栈。

接下来,我们以手淘的主线程死锁问题为例,进行根因分析。首先,来看一下某版本手淘Abort问题数据的总体视图:
3111111.png

由于Abort问题出现之前,内存、CPU使用量正常,因此初步判断造成异常退出的原因为主线程死锁。
32222222.png

查看相关日志文件,验证时间、线索吻合,因此可最终确定造成异常退出的原因为主线程死锁。
333333333.png

四、Abort问题的系统性解决方案

4.1 Abort系统性解决方案难点:现场捕获

为实现Abort问题的系统性解决方案,需充分考虑以下问题:
1.通过signal 9杀死进程造成的Abort问题,往往难以通过信号量捕获至堆栈。在这种情况下,应如何尽可能完整地捕获崩溃现场的关键信息?具体包含哪些信息?
2.App崩溃时系统处于极不稳定的状态,应如何保证崩溃现数据稳定落盘?
3.在信息采集、数据捕获的过程中,需对大量数据进行写入操作,应如何保证日志高性能写入?
4.在数据量较大的情况下,数据的存储、上传可能对系统造成较大压力,应如何保证数据的高压缩率?
41111.png

基于以上考虑,我们提出并设计了一套基于mmap的高性能、高压缩率、高一致性、可自解释的trace文件协议,作为iOS端高可用体系的数据载体。

4.1.1 mmap数据存储层保证数据写入的高性能和高一致性

1.通过mmap将一个文件或者其它对象映射到进程的地址空间,对内存的操作会由内核将数据写到对应的磁盘文件上;数据写入的性能与内存操作相当(略比内存操作高)
2.用户进程崩溃之后,这块映射区仍由内核管理,可以保证数据的一致性

4.1.2 二进制编码协议保证数据压缩率最高

1.具体编码协议
2.实测编码在压缩率能达到80%以上,或者直观一点说,使用50k的内存可以记录下用户二十分钟内详细的使用记录,包括页面访问记录、系统事件、秒级别的内存、CPU数据。

4.1.3 尽可能多的记录系统多维度指标及异常事件

包括:
1.性能数据,包括CPU、内存数据,用于判断应用当前是不是处理overload状态
2.大内存申请
3.Retain Cycle,用于定位Jetsam Event
4.卡顿,用于定位watch dog kill
5.当前存活VC实例数量
413.png

五、总结

在App的世界里,功能层面的差异已经越来越难以体现。在这种情况下,良好的用户体验,往往是App致胜的关键。而Abort问题对于每一个App而言,都是对用户体验的最大挑战,需要App开发者给予足够的重视。
为了更好地发现解决崩溃问题,构建异常“感知-定位-恢复”的运维能力闭环,提升 App 使用体验,建议接入阿里云崩溃分析,支持各类异常事件采集,支持现场回溯分析,帮助您更好的提高iOS App稳定性。

钉钉搜索35248489,加入阿里云云原生应用研发平台EMAS技术交流群,探讨最新最热门的应用研发技术和实践。(或钉钉扫码加入)

作者:淘宝庐轩

相关文章
|
18天前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
14天前
|
安全 数据安全/隐私保护 Android开发
深入探索iOS系统安全机制:从基础到高级
本文旨在全面解析iOS操作系统的安全特性,从基础的权限管理到高级的加密技术,揭示苹果如何构建一个既开放又安全的移动平台。我们将通过实例和分析,探讨iOS系统如何保护用户数据免受恶意软件、网络攻击的威胁,并对比Android系统在安全性方面的差异。
|
20天前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
54 2
|
29天前
|
安全 搜索推荐 Android开发
深入探索安卓与iOS系统的差异及其对用户体验的影响
在当今的智能手机市场中,安卓和iOS是两大主流操作系统。它们各自拥有独特的特性和优势,为用户提供了不同的使用体验。本文将深入探讨安卓与iOS系统之间的主要差异,包括它们的设计理念、用户界面、应用生态以及安全性等方面,并分析这些差异如何影响用户的使用体验。
|
28天前
|
安全 搜索推荐 Android开发
揭秘iOS与Android系统的差异:一场技术与哲学的较量
在当今数字化时代,智能手机操作系统的选择成为了用户个性化表达和技术偏好的重要标志。iOS和Android,作为市场上两大主流操作系统,它们之间的竞争不仅仅是技术的比拼,更是设计理念、用户体验和生态系统构建的全面较量。本文将深入探讨iOS与Android在系统架构、应用生态、用户界面及安全性等方面的本质区别,揭示这两种系统背后的哲学思想和市场策略,帮助读者更全面地理解两者的优劣,从而做出更适合自己的选择。
|
19天前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
21天前
|
安全 Android开发 iOS开发
安卓系统与iOS系统的比较####
【10月更文挑战第26天】 本文将深入探讨安卓(Android)和iOS这两大主流移动操作系统的各自特点、优势与不足。通过对比分析,帮助读者更好地理解两者在用户体验、应用生态、系统安全等方面的差异,从而为消费者在选择智能手机时提供参考依据。无论你是技术爱好者还是普通用户,这篇文章都将为你揭示两大系统背后的故事和技术细节。 ####
40 0
|
1月前
|
IDE Android开发 iOS开发
探索安卓与iOS系统的技术差异:开发者的视角
本文深入分析了安卓(Android)与苹果iOS两大移动操作系统在技术架构、开发环境、用户体验和市场策略方面的主要差异。通过对比这两种系统的不同特点,旨在为移动应用开发者提供有价值的见解,帮助他们在不同平台上做出更明智的开发决策。
|
1月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
82 7
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台解决方案
【9月更文挑战第27天】在移动应用开发的广阔天地中,安卓和iOS两大操作系统如同双子星座般耀眼。开发者们在这两大平台上追逐着创新的梦想,却也面临着选择的难题。如何在保持高效的同时,实现跨平台的开发?本文将带你探索跨平台开发的魅力所在,揭示其背后的技术原理,并通过实际案例展示其应用场景。无论你是安卓的忠实拥趸,还是iOS的狂热粉丝,这篇文章都将为你打开一扇通往跨平台开发新世界的大门。