iOS App后台Crash类型

后台Crash

苹果在 WWDC 2020 上的介绍,目前会导致App在后台被杀死的情况大概有以下 6 种。

1、崩溃(Crashes)

代码逻辑的Crash引发App闪退。

2、CPU资源限制(CPU resource limit)

后台长时间占用CPU资源过高(High sustained CPU load in background)

3、看门狗(Watchdog)

Exception Type:  EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Termination Reason: Namespace SPRINGBOARD, Code 0x8badf00d
  • 死锁
  • 无限循环
  • 同步操作
    注意APP在不同的生命周期,看门狗的超时时间是不同的,前台正常运行时,超时时间为20s。

4、内存超出系统限制(Memory limit exceeded)

APP占用内存超过阈值(App using too much memory)
阈值在前台和后台是一样的,但是不同设备不一样(Same limit for foreground and background)
越老的设备阈值越低,6S以前设备使用内存不要超过200MB(Keep in mind older devices(such as before 6S,Limit is 200MB))

5、内存自动清理(Memory pressure exit)

通常不是程序问题(Not a bug with you app),无法避免
系统为了给其他APP内存而杀掉后台的程序机制
尽量保证程序在后台占用内存小于50MB(Aim for less than 50MB in the background)

6、后台任务超时(Background task timeout)

执行后台任务时,未在30s内结束后台任务(Failure ro end the task explicitly result in termination.(in 30s))

可以使用以下方法

- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void(^ __nullable)(void))handler  API_AVAILABLE(ios(4.0)) NS_REQUIRES_SUPER;
- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithName:(nullable NSString *)taskName expirationHandler:(void(^ __nullable)(void))handler API_AVAILABLE(ios(7.0)) NS_REQUIRES_SUPER;
- (void)endBackgroundTask:(UIBackgroundTaskIdentifier)identifier API_AVAILABLE(ios(4.0)) NS_REQUIRES_SUPER;

这个方法为你的应用程序请求额外的后台执行时间。当在App即将进入后台,而这时候有些task还没来得及完成,这时候可以使用这个方法,将额外为App增加30秒的运行时间,这方法是和endBackgroundTask方法配对使用,一般在- (void)applicationDidEnterBackground:(UIApplication *)application方法内使用。如果超过30秒,后台任务还没结束,App将会被系统强制杀死,而不是进入Suspended状态。

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    __block UIBackgroundTaskIdentifier taskID = [application beginBackgroundTaskWithExpirationHandler:^{
        [application endBackgroundTask:taskID];
        taskID = UIBackgroundTaskInvalid;
    }];
}

冷启动和热启动

  • 冷启动:指APP被后台kill后重新启动APP,这种启动方式叫做冷启动。
  • 热启动:APP的状态由running切换为suspend,APP 没有被kill仍然在后台运行。再次把APP切换到前台,这种启动方式叫热启动。

Suspended状态
程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。

OOM

以下,重点说一下第5、内存自动清理(Memory pressure exit)
在iOS中,当前应用因为内存占用过高而被操作系统强制终止,从设备设置-隐私-分析与改进中是找不到普通类型的崩溃日志,只能够找到Jetsam开头的日志,这种形式的日志其实就是 OOM 崩溃之后系统生成的一种专门反映内存异常问题的日志。

OOM 分为
FOOM(Foreground Out Of Memory)
BOOM(background Out Of Memory)

Jetsam是 iOS 操作系统为了控制内存资源过度使用而采用的一种资源管控机制。不同于MacOS,Linux,Windows等桌面操作系统,出于性能方面的考虑,iOS 系统并没有设计内存交换空间的机制,所以在 iOS 中,如果设备整体内存紧张的话,系统只能将一些优先级不高或占用内存过大的进程直接终止掉。Jetsam机制终止进程的时候最终是通过发送SIGKILL异常信号来完成的,但是SIGKILL信号不可以在当前进程被忽略或者被捕获。所以可以使用排除法来得到是否发生了FOOM,排除已知的能收到Crash signal的类型,剩下的就是不能收到signal的SIGKILL类型Crash,这种方法不是很精准。

image.jpeg

SIGKILL

此信号表示系统中止进程,通常是调用函数exit()kill(9)产生。
常见的Crash编码类型如下,上述所说的OOM也是发送SIGKILL来终止App的。
常见SIGKILL类型

0x8badf00d:ate bad food,触发系统看门狗。
0xc00010ff:cool off,系统由于过热保护中止应用。
0xbada5e47:Background Task任务超时(30s)

SIGKILL等价于kill -9,它是用来杀死僵尸进程;而SIGABRT等价于kill -6,它是用来杀死正在运行的进程。

SIGKILL不能被捕获或忽略,也就是说此类 Crash 第三方的收集框架捕获不到,此时在只可以在用户的设备中能找到操作系统生成的卡死崩溃日志。而SIGABRT可以被捕获,但不能阻塞。

MetricKit

注意:iOS 13推出的MetricKit框架,其中应用程序退出是 MetricKit 在 iOS 14 上新增的一个指标 MXAppExitMetric 。他统计的是每天应用程序在前台、后台运行的时候退出或被杀的原因概述。

image.jpeg

使用MXBackgrounndExitData(iOS14 MetricKit)能够统计的数据

*   cumulativeNormalAppExitCount:正常退出次数
*   cumulativeMemoryResourceLimitExitCount:内存OOM引起程序退出次数
*   cumulativeCPUResourceLimitExitCount:cpu资源超限引起退出次数
*   cumulativeMemoryPressureExitCount:系统内存自动清理引起退出次数
*   cumulativeBadAccessExitCount:非法访问(SIGSEGV/SIGBUS)引起退出次数
*   cumulativeAbnormalExitCount:Abort函数中止引起退出次数
*   cumulativeIllegalInstructionExitCount:非法指令(SIG)引起退出次数
*   cumulativeAppWatchdogExitCount:看门狗(WatchDog)引起的退出次数
*   cumulativeSuspendedWithLockedFileExitCount:后台读写文件引起的退出次数
*   cumulativeBackgroundTaskAssertionTimeoutExitCount:后台任务超时引起的退出次数

参考
https://developer.apple.com/videos/play/wwdc2020/10078/
https://www.infoq.cn/article/ox7u3ymwiwzamt1vgm7m

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335