转载自: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 由于运行形成设备温度过高而被杀掉。