介紹
如果對crash捕獲不太了解,可以先參考這篇文章,本文進行Mach異常+Unix信號方式捕獲crash。
NSException一般只在OC當中被捕獲,一般情況下在捕獲NSException異常後同時也會捕獲到一個對應的signal異常。但如果你使用的是純swift開發,如下代碼並不會捕獲相關的crash
NSSetUncaughtExceptionHandler(UncaughtExceptionHandler)
swift崩潰捕獲
swift通常都是通過對應的signal來捕獲crash。對於swift的崩潰捕獲,Apple的文檔中有描述說需要通過SIGTRAP信號捕獲強轉失敗,及非可選的nil值導致的崩潰.具體描述如下:
Trace Trap[EXC_BREAKPOINT // SIGTRAP] 類似於異常退出,此異常旨在使附加的調試器有機會在其執行中的特定點中斷進程。您可以使用該__builtin_trap()函數從您自己的代碼觸發此異常。如果沒有附加調試器,則該過程將終止並生成崩潰報告。 較低級的庫(例如,libdispatch)會在遇到致命錯誤時捕獲進程。有關錯誤的其他信息可以在崩潰報告的“ 附加診斷信息”部分或設備的控制台中找到。 如果在運行時遇到意外情況,Swift代碼將以此異常類型終止,例如: 1.具有nil值的非可選類型 2.一個失敗的強制類型轉換
對於swift還有一種崩潰需要捕獲(Intel處理器,我認為應該是指在模擬器上的崩潰),為保險起見,也需要將信號SIGILL進行注冊,Apple同樣對其中做了描述
Illegal Instruction[EXC_BAD_INSTRUCTION // SIGILL] 該過程嘗試執行非法或未定義的指令。該過程可能嘗試通過錯誤配置的函數指針跳轉到無效地址。 在Intel處理器上,ud2操作碼引起EXC_BAD_INSTRUCTION異常,但通常用於進程調試目的。如果在運行時遇到意外情況,Intel處理器上的Swift代碼將以此異常類型終止。有關詳細信息,請參閱Trace Trap。
最終實現代碼參考
//對於OC的exception采取如下方式捕獲 NSSetUncaughtExceptionHandler(UncaughtExceptionHandler) //對於Swift則捕獲相關signa,一般來說如下幾種已經能夠捕獲大部分crash。(其中SIGTRAP一定要捕獲,swift大量的crash都會通過它) signal(SIGABRT, SignalExceptionHandler) signal(SIGSEGV, SignalExceptionHandler) signal(SIGBUS, SignalExceptionHandler) signal(SIGTRAP, SignalExceptionHandler) signal(SIGILL, SignalExceptionHandler)
這是一個Demo,如果對你有幫助,給個star呗。
參考文檔連接
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。