你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> iOS Swift Crash的捕獲

iOS Swift Crash的捕獲

編輯:IOS開發基礎

介紹

  • 如果對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呗。
參考文檔連接

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved