iOS-底层原理38-Crash分析

《iOS底层原理文章汇总》

Crash分析

crash常见场景:KVO、数组越界、野指针、后台任务超时内存泄漏、找不到方法
crash处理步骤:捕捉、分析、包装、上传、crash起死回生

1.遇到数组越界崩溃:防止数组越界进行针对性处理,进行methodSwizzling

iOS-底层原理38-Crash分析_第1张图片
image.png

iOS-底层原理38-Crash分析_第2张图片
image.png

2.若遇到其他除数组越界外的其他中情况的奔溃呢?此时需要做统一处理,上传奔溃日志到服务器

3.奔溃产生被捕捉的过程

1.查看堆栈信息知道:libobjc.A.dylib中调用了objc_exception_throw从而发生崩溃


image.png

2.通过bt进一步查看:在libobjc.A.dylib中会调用objc_exception_rethrow方法-->进而调用__terminate(void(*)())-->_objc_terminate()


image.png

3.查看objc源码溯源走到_objc_terminate()方法的流程,找到_objc_terminate()在void exception_init(void)方法中被初始化
iOS-底层原理38-Crash分析_第3张图片
image.png

在_objc_init()进行初始化的时候调用exception_init()进行set方法设置句柄old_terminate = std::set_terminate(&_objc_terminate),当崩溃的时候回调_objc_terminate


iOS-底层原理38-Crash分析_第4张图片
image.png

若发生异常,扔出__cxa_rethrow(),执行回调函数uncaught_handler
iOS-底层原理38-Crash分析_第5张图片
image.png

iOS-底层原理38-Crash分析_第6张图片
image.png

iOS-底层原理38-Crash分析_第7张图片
image.png

可以再AppDelegate中设置句柄,将回调函数fn为LGExceptionHandlers,函数名为函数的地址
iOS-底层原理38-Crash分析_第8张图片
image.png

可在回调函数中设置运行循环防止程序崩溃,通过遍历当前runloop中的mode,运行而防止程序崩溃,事务的奔溃来自于运行循环的崩溃,拷贝所有的事务allmodes进行挂起转圈圈,重新处理数据的丢失或上传报告,及时处理很多的事务,上传或下发数据过程中的不及时,控制程序跳入其他页面奔溃,或上传报告
iOS-底层原理38-Crash分析_第9张图片
image.png

4.流程图


image.png

5.有了crash日志文件后可以通过如下穿山甲救蛇精在的一篇博客中的方法来分析奔溃日志《iOS崩溃日志分析__dSYM解析》。

你可能感兴趣的:(iOS-底层原理38-Crash分析)