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
喚醒時間不穩定,而且用戶可以在系統設置關閉這種方式,導致它的使用場景很少
3. Silent Push
推送的一種,會在后臺喚起 App 30秒。它的優先級很低,會調用 application:didReceiveRemoteNotifiacation:fetchCompletionHandler: 這個 Delegate, 和普通的 remote push notification 推送調用的 delegate 是一樣的
4. PushKit
后臺喚醒 App 后能夠保活 30 秒。主要用于提升 VoIP 應用的體驗
5. Background Task 方式
是使用最多的,App 退后臺后,默認都會使用這種方式
通常,程序在退到后臺以后,只有幾秒鐘的時間可以執行代碼,接下來就會被系統掛起。進程掛起后所有線程都會暫停,不管這個線程是文件讀寫還是內存讀寫都會被暫停,但是,數據讀寫過程無法暫停只能被中斷,中斷時數據讀寫異常而且容易損壞文件,所以系統會選擇主動殺掉 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 退后臺容易出現崩潰的原因。
如何避免后臺崩潰
App 退后臺后,如果執行時間過長就會導致被系統殺掉,那么我們就不能讓程序進入后臺后執行復雜的任務。如嚴格控制后臺數據的讀寫操作。在需要處理數據時先判斷其大小,如果數據過大可以考慮程序下次啟動或后臺喚醒時再進行處理。
分析并解決崩潰問題
采集到的崩潰日志主要包括:
進程信息:崩潰進城相關信息,比如崩潰報告唯一標示符、唯一鍵值、設備標識;
基本信息:崩潰發生的日期,iOS版本
異常信息:異常類型,異常編碼,異常的線程;
線程回溯:崩潰時的方法調用棧
通常情況下,我們分析崩潰日志時最先看的是異常信息,分析出問題的是哪個線程,在線程回溯
里找到那個線程;然后,分析方法調用棧,符號化后的方法調用棧可以完整地看到方法調用的過
程,從而知道問題發生在哪個方法的調用上。
方法調用棧頂,就是最后導致崩潰的方法的調用。完整的崩潰日志里,除了線程方法調用棧還有異常編碼,就在異常信息里。在 完整的異常編碼 里可以看到44種異常編碼。常見的三種如下:
0x8badf00d,表示 App 在一定時間內無響應而被 watchdog 殺掉的情況。
0xdeadfa11,表示 App 被用戶強制退出。
0xc00010ff,表示 App 因為運行造成設備溫度太高而被殺掉。
轉載于:https://www.cnblogs.com/IT-DavidYang/p/10977214.html
總結
以上是生活随笔為你收集整理的iOS进阶 - iOS如何监控崩溃的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浏览器在线预览pdf、txt、offic
- 下一篇: windows下python虚拟环境vi