漫谈iOS Crash收集框架
Handling unhandled exceptions and signals
plcrashreporter
注意:因为硬件产生的信号(通过CPU陷阱)被Mach层捕获,然后才转换为对应的Unix信号;苹果为了统一机制,于是操作系统和用户产生的信号(通过调用kill和pthread_kill)也首先沉下来被转换为Mach异常,再转换为Unix信号。【摘自:http://www.cocoachina.com/ios/20150701/12301.html 】
ios不响应signal处理函数?原因是xcode编译运行了程序,如果直接发送signal,xCode会直接收到信号立刻中断程序运行,直接跳过signal处理函数。需要手动停止xCode运行的程序,再在模拟器 运行,发送了signal,这样才可以进入了signal处理方法!【摘自:http://blog.csdn.net/u011615945/article/details/38059947 】
如果同时有多方通过NSSetUncaughtExceptionHandler注册异常处理程序,和平的作法是:后注册者通过NSGetUncaughtExceptionHandler将先前别人注册的handler取出并备份,在自己handler处理完后自觉把别人的handler注册回去,规规矩矩的传递。不传递强行覆盖的后果是,在其之前注册过的日志收集服务写出的Crash日志就会因为取不到NSException而丢失Last Exception Backtrace等信息。(P.S. iOS系统自带的Crash Reporter不受影响)【摘自:http://www.cocoachina.com/ios/20150701/12301.html 】
对于多方通过NSSetUncaughtExceptionHandler注册异常处理的情况,我实际中可行的做法是
static NSUncaughtExceptionHandler *currentUncaughtExceptionHandler;
currentUncaughtExceptionHandler = NSGetUncaughtExceptionHandler();
/*
handle you runloop and handle exception
**/
//NSSetUncaughtExceptionHandler(currentUncaughtExceptionHandler);//试了这种写法,但最终没执行currentUncaughtExceptionHandler,然后改成下面的写法了
NSSetUncaughtExceptionHandler(NULL);//担心不重置为NULL会出现handle死循环
currentUncaughtExceptionHandler(exception);
看了几篇异常处理相关的博客,多半都是获取backtrace,但是获取的信息很有限,并不能获取crash发生时多个线程的信息,导致有些时候很难定位到问题所在,plcrashreporter做的就很好,看来以后有空还得研究下plcrashreporter
源码了。
网友评论