漫談iOS Crash收集框架
Handling unhandled exceptions and signals
plcrashreporter
注意:因?yàn)橛布a(chǎn)生的信號(hào)(通過(guò)CPU陷阱)被Mach層捕獲,然后才轉(zhuǎn)換為對(duì)應(yīng)的Unix信號(hào);蘋(píng)果為了統(tǒng)一機(jī)制,于是操作系統(tǒng)和用戶(hù)產(chǎn)生的信號(hào)(通過(guò)調(diào)用kill和pthread_kill)也首先沉下來(lái)被轉(zhuǎn)換為Mach異常,再轉(zhuǎn)換為Unix信號(hào)?!菊裕?a target="_blank" rel="nofollow">http://www.cocoachina.com/ios/20150701/12301.html 】
ios不響應(yīng)signal處理函數(shù)?原因是xcode編譯運(yùn)行了程序,如果直接發(fā)送signal,xCode會(huì)直接收到信號(hào)立刻中斷程序運(yùn)行,直接跳過(guò)signal處理函數(shù)。需要手動(dòng)停止xCode運(yùn)行的程序,再在模擬器 運(yùn)行,發(fā)送了signal,這樣才可以進(jìn)入了signal處理方法!【摘自:http://blog.csdn.net/u011615945/article/details/38059947 】
如果同時(shí)有多方通過(guò)NSSetUncaughtExceptionHandler注冊(cè)異常處理程序,和平的作法是:后注冊(cè)者通過(guò)NSGetUncaughtExceptionHandler將先前別人注冊(cè)的handler取出并備份,在自己handler處理完后自覺(jué)把別人的handler注冊(cè)回去,規(guī)規(guī)矩矩的傳遞。不傳遞強(qiáng)行覆蓋的后果是,在其之前注冊(cè)過(guò)的日志收集服務(wù)寫(xiě)出的Crash日志就會(huì)因?yàn)槿〔坏絅SException而丟失Last Exception Backtrace等信息。(P.S. iOS系統(tǒng)自帶的Crash Reporter不受影響)【摘自:http://www.cocoachina.com/ios/20150701/12301.html 】
對(duì)于多方通過(guò)NSSetUncaughtExceptionHandler注冊(cè)異常處理的情況,我實(shí)際中可行的做法是
static NSUncaughtExceptionHandler *currentUncaughtExceptionHandler;
currentUncaughtExceptionHandler = NSGetUncaughtExceptionHandler();
/*
handle you runloop and handle exception
**/
//NSSetUncaughtExceptionHandler(currentUncaughtExceptionHandler);//試了這種寫(xiě)法,但最終沒(méi)執(zhí)行currentUncaughtExceptionHandler,然后改成下面的寫(xiě)法了
NSSetUncaughtExceptionHandler(NULL);//擔(dān)心不重置為NULL會(huì)出現(xiàn)handle死循環(huán)
currentUncaughtExceptionHandler(exception);
看了幾篇異常處理相關(guān)的博客,多半都是獲取backtrace,但是獲取的信息很有限,并不能獲取crash發(fā)生時(shí)多個(gè)線程的信息,導(dǎo)致有些時(shí)候很難定位到問(wèn)題所在,plcrashreporter做的就很好,看來(lái)以后有空還得研究下plcrashreporter
源碼了。