iOS App后臺Crash類型

后臺Crash

蘋果在 WWDC 2020 上的介紹,目前會導(dǎo)致App在后臺被殺死的情況大概有以下 6 種辟癌。

1寒屯、崩潰(Crashes)

代碼邏輯的Crash引發(fā)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
  • 死鎖
  • 無限循環(huán)
  • 同步操作
    注意APP在不同的生命周期,看門狗的超時時間是不同的厂置,前臺正常運(yùn)行時菩掏,超時時間為20s。

4昵济、內(nèi)存超出系統(tǒng)限制(Memory limit exceeded)

APP占用內(nèi)存超過閾值(App using too much memory)
閾值在前臺和后臺是一樣的智绸,但是不同設(shè)備不一樣(Same limit for foreground and background)
越老的設(shè)備閾值越低或颊,6S以前設(shè)備使用內(nèi)存不要超過200MB(Keep in mind older devices(such as before 6S,Limit is 200MB))

5、內(nèi)存自動清理(Memory pressure exit)

通常不是程序問題(Not a bug with you app)传于,無法避免
系統(tǒng)為了給其他APP內(nèi)存而殺掉后臺的程序機(jī)制
盡量保證程序在后臺占用內(nèi)存小于50MB(Aim for less than 50MB in the background)

6、后臺任務(wù)超時(Background task timeout)

執(zhí)行后臺任務(wù)時醉顽,未在30s內(nèi)結(jié)束后臺任務(wù)(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;

這個方法為你的應(yīng)用程序請求額外的后臺執(zhí)行時間沼溜。當(dāng)在App即將進(jìn)入后臺,而這時候有些task還沒來得及完成游添,這時候可以使用這個方法系草,將額外為App增加30秒的運(yùn)行時間,這方法是和endBackgroundTask方法配對使用唆涝,一般在- (void)applicationDidEnterBackground:(UIApplication *)application方法內(nèi)使用找都。如果超過30秒,后臺任務(wù)還沒結(jié)束廊酣,App將會被系統(tǒng)強(qiáng)制殺死能耻,而不是進(jìn)入Suspended狀態(tài)。

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

冷啟動和熱啟動

  • 冷啟動:指APP被后臺kill后重新啟動APP亡驰,這種啟動方式叫做冷啟動晓猛。
  • 熱啟動:APP的狀態(tài)由running切換為suspend,APP 沒有被kill仍然在后臺運(yùn)行凡辱。再次把APP切換到前臺戒职,這種啟動方式叫熱啟動。

Suspended狀態(tài)
程序在后臺不能執(zhí)行代碼透乾。系統(tǒng)會自動把程序變成這個狀態(tài)而且不會發(fā)出通知洪燥。當(dāng)掛起時,程序還是停留在內(nèi)存中的乳乌,當(dāng)系統(tǒng)內(nèi)存低時捧韵,系統(tǒng)就把掛起的程序清除掉,為前臺程序提供更多的內(nèi)存钦扭。

OOM

以下纫版,重點(diǎn)說一下第5、內(nèi)存自動清理(Memory pressure exit)
在iOS中客情,當(dāng)前應(yīng)用因?yàn)閮?nèi)存占用過高而被操作系統(tǒng)強(qiáng)制終止其弊,從設(shè)備設(shè)置-隱私-分析與改進(jìn)中是找不到普通類型的崩潰日志,只能夠找到Jetsam開頭的日志膀斋,這種形式的日志其實(shí)就是 OOM 崩潰之后系統(tǒng)生成的一種專門反映內(nèi)存異常問題的日志梭伐。

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

Jetsam是 iOS 操作系統(tǒng)為了控制內(nèi)存資源過度使用而采用的一種資源管控機(jī)制。不同于MacOS仰担,Linux糊识,Windows等桌面操作系統(tǒng),出于性能方面的考慮,iOS 系統(tǒng)并沒有設(shè)計內(nèi)存交換空間的機(jī)制赂苗,所以在 iOS 中愉耙,如果設(shè)備整體內(nèi)存緊張的話,系統(tǒng)只能將一些優(yōu)先級不高或占用內(nèi)存過大的進(jìn)程直接終止掉拌滋。Jetsam機(jī)制終止進(jìn)程的時候最終是通過發(fā)送SIGKILL異常信號來完成的朴沿,但是SIGKILL信號不可以在當(dāng)前進(jìn)程被忽略或者被捕獲。所以可以使用排除法來得到是否發(fā)生了FOOM败砂,排除已知的能收到Crash signal的類型赌渣,剩下的就是不能收到signal的SIGKILL類型Crash,這種方法不是很精準(zhǔn)昌犹。

image.jpeg

SIGKILL

此信號表示系統(tǒng)中止進(jìn)程坚芜,通常是調(diào)用函數(shù)exit()kill(9)產(chǎn)生。
常見的Crash編碼類型如下斜姥,上述所說的OOM也是發(fā)送SIGKILL來終止App的鸿竖。
常見SIGKILL類型

0x8badf00d:ate bad food,觸發(fā)系統(tǒng)看門狗铸敏。
0xc00010ff:cool off千贯,系統(tǒng)由于過熱保護(hù)中止應(yīng)用。
0xbada5e47:Background Task任務(wù)超時(30s)

SIGKILL等價于kill -9搞坝,它是用來殺死僵尸進(jìn)程搔谴;而SIGABRT等價于kill -6,它是用來殺死正在運(yùn)行的進(jìn)程桩撮。

SIGKILL不能被捕獲或忽略敦第,也就是說此類 Crash 第三方的收集框架捕獲不到,此時在只可以在用戶的設(shè)備中能找到操作系統(tǒng)生成的卡死崩潰日志店量。而SIGABRT可以被捕獲芜果,但不能阻塞。

MetricKit

注意:iOS 13推出的MetricKit框架融师,其中應(yīng)用程序退出是 MetricKit 在 iOS 14 上新增的一個指標(biāo) MXAppExitMetric 右钾。他統(tǒng)計的是每天應(yīng)用程序在前臺、后臺運(yùn)行的時候退出或被殺的原因概述旱爆。

image.jpeg

使用MXBackgrounndExitData(iOS14 MetricKit)能夠統(tǒng)計的數(shù)據(jù)

*   cumulativeNormalAppExitCount:正常退出次數(shù)
*   cumulativeMemoryResourceLimitExitCount:內(nèi)存OOM引起程序退出次數(shù)
*   cumulativeCPUResourceLimitExitCount:cpu資源超限引起退出次數(shù)
*   cumulativeMemoryPressureExitCount:系統(tǒng)內(nèi)存自動清理引起退出次數(shù)
*   cumulativeBadAccessExitCount:非法訪問(SIGSEGV/SIGBUS)引起退出次數(shù)
*   cumulativeAbnormalExitCount:Abort函數(shù)中止引起退出次數(shù)
*   cumulativeIllegalInstructionExitCount:非法指令(SIG)引起退出次數(shù)
*   cumulativeAppWatchdogExitCount:看門狗(WatchDog)引起的退出次數(shù)
*   cumulativeSuspendedWithLockedFileExitCount:后臺讀寫文件引起的退出次數(shù)
*   cumulativeBackgroundTaskAssertionTimeoutExitCount:后臺任務(wù)超時引起的退出次數(shù)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舀射,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子怀伦,更是在濱河造成了極大的恐慌脆烟,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件房待,死亡現(xiàn)場離奇詭異邢羔,居然都是意外死亡驼抹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門拜鹤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來框冀,“玉大人,你說我怎么就攤上這事敏簿∽蠹荩” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵极谊,是天一觀的道長。 經(jīng)常有香客問我安岂,道長轻猖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任域那,我火速辦了婚禮咙边,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘次员。我一直安慰自己败许,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布淑蔚。 她就那樣靜靜地躺著市殷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刹衫。 梳的紋絲不亂的頭發(fā)上醋寝,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音带迟,去河邊找鬼音羞。 笑死,一個胖子當(dāng)著我的面吹牛仓犬,可吹牛的內(nèi)容都是我干的嗅绰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼搀继,長吁一口氣:“原來是場噩夢啊……” “哼窘面!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起叽躯,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤民镜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后险毁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體制圈,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡们童,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鲸鹦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慧库。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖馋嗜,靈堂內(nèi)的尸體忽然破棺而出齐板,到底是詐尸還是另有隱情,我是刑警寧澤葛菇,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布甘磨,位于F島的核電站,受9級特大地震影響眯停,放射性物質(zhì)發(fā)生泄漏济舆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一莺债、第九天 我趴在偏房一處隱蔽的房頂上張望滋觉。 院中可真熱鬧,春花似錦齐邦、人聲如沸椎侠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽我纪。三九已至,卻和暖如春丐吓,著一層夾襖步出監(jiān)牢的瞬間宣羊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工汰蜘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仇冯,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓族操,卻偏偏與公主長得像苛坚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子色难,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344