iOS進階 - iOS如何監控崩潰

轉載自:https://blog.csdn.net/qxuewei/article/details/90760508數組

iOS進階 - iOS如何監控崩潰
幾種常見的崩潰
數組越界;給數組添加 nil;
多線程問題: 在子線程更新UI, 不一樣線程操做同一個數據。
主線程無響應:主線程超過系統規定時間無響應就會被 Watchdog 殺掉。
野指針:指針指向一個已刪除的內存區域會出現野指針崩潰。
KVO 問題
後臺任務超時
iOS 後臺保活的五種方式
1. Background Mode
App 審覈時會提升對 App 的要求。一般狀況下只有那些 地圖、音樂播放、VoIP類的App 才能經過審覈多線程

2. Background Fetch
喚醒時間不穩定,並且用戶能夠在系統設置關閉這種方式,致使它的使用場景不多app

3. Silent Push
推送的一種,會在後臺喚起 App 30秒。它的優先級很低,會調用 application:didReceiveRemoteNotifiacation:fetchCompletionHandler: 這個 Delegate, 和普通的 remote push notification 推送調用的 delegate 是同樣的fetch

4. PushKit
後臺喚醒 App 後可以保活 30 秒。主要用於提高 VoIP 應用的體驗編碼

5. Background Task 方式
是使用最多的,App 退後臺後,默認都會使用這種方式.net

一般,程序在退到後臺之後,只有幾秒鐘的時間能夠執行代碼,接下來就會被系統掛起。進程掛起後全部線程都會暫停,無論這個線程是文件讀寫仍是內存讀寫都會被暫停,可是,數據讀寫過程沒法暫停只能被中斷,中斷時數據讀寫異常並且容易損壞文件,因此係統會選擇主動殺掉 App 進程。線程

而 Background Task 方式就是系統提供了 beginBackgroundTaskWithExpirationHandler 方法來延長後臺執行時間,能夠解決退後臺還須要一段時間處理一些任務的訴求。指針

Background Task 方式的使用方法,以下代碼所示:日誌

- (void)applicationDidEnterBackground:(UIApplication *)application {
self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^(void) {
[self yourTask];
}];
}
1
2
3
4
5
這段代碼中,yourTask 任務最多執行 3 分鐘,3 分鐘內 yourTask 運行完成,你的App就會掛起。若是3分鐘內沒有執行完成的話,系統會強制殺掉進程,從而形成崩潰,這就是爲何 App 退後臺容易出現崩潰的緣由。blog

如何避免後臺崩潰
App 退後臺後,若是執行時間過長就會致使被系統殺掉,那麼咱們就不能讓程序進入後臺後執行復雜的任務。如嚴格控制後臺數據的讀寫操做。在須要處理數據時先判斷其大小,若是數據過大能夠考慮程序下次啓動或後臺喚醒時再進行處理。

分析並解決崩潰問題
採集到的崩潰日誌主要包括:

進程信息:崩潰進城相關信息,好比崩潰報告惟一標示符、惟一鍵值、設備標識;
基本信息:崩潰發生的日期,iOS版本
異常信息:異常類型,異常編碼,異常的線程;
線程回溯:崩潰時的方法調用棧
一般狀況下,咱們分析崩潰日誌時最早看的是異常信息,分析出問題的是哪一個線程,在線程回溯
裏找到那個線程;而後,分析方法調用棧,符號化後的方法調用棧能夠完整地看到方法調用的過
程,從而知道問題發生在哪一個方法的調用上。

方法調用棧頂,就是最後致使崩潰的方法的調用。完整的崩潰日誌裏,除了線程方法調用棧還有異常編碼,就在異常信息裏。在 完整的異常編碼 裏能夠看到44種異常編碼。常見的三種以下:

0x8badf00d,表示 App 在必定時間內無響應而被 watchdog 殺掉的狀況。0xdeadfa11,表示 App 被用戶強制退出。0xc00010ff,表示 App 由於運行形成設備溫度過高而被殺掉。

相關文章
相關標籤/搜索