2016-03-31 79 views
11

在Objective-C中,NSSetUncaughtExceptionHandler可以註冊一些功能來對異常進行最後一分鐘的日誌記錄。如何捕捉Swift崩潰並執行一些日誌記錄

這沒有發現Swift崩潰的東西。

是否可以在Swift中的全局級別執行此類操作?例如。如果在Swift代碼中發生崩潰,請執行一些日誌記錄,如強制解包無可選項。

具體來說,我正在做一個實用程序來記錄應用程序中的網絡流量,如果發生崩潰,我想將我的內存數據刷新到磁盤。

+0

我想也許蘋果公司沒有像Refactor一樣爲此工作。 – Lumialxk

回答

1

有多個方面的解答,讓我嘗試回答他們:

  1. NSSetUncaughtExceptionHandler僅捕獲未捕獲的異常這是唯一可能崩潰的一小部分。
  2. Objective-C中的例外定義爲致命的,不建議捕獲它們,甚至更不建議運行任何非異步安全代碼,其中包括任何Objective-C和Swift代碼
  3. 要捕捉崩潰您需要設置信號處理程序,然後僅在崩潰時運行異步安全代碼,這只是C的一小部分。尤其是在崩潰時您可能不會分配新內存。
  4. 請記住,當您的應用程序崩潰時,它將處於非常不穩定的代碼中,並且對象或變量引用可能指向某種完全意想不到的情況。所以在碰撞時你根本不應該做任何事情。
  5. 處理崩潰的最佳開源方式是使用PLCrashReporter,它還提供了在崩潰時調用代碼的方法。但是,這又必須是異步安全的。

到您的具體情況:你不應該這樣做,而不是嘗試。這可能會導致用戶數據損壞或更多數據丟失。該應用程序崩潰嚴重的問題,而不是解決這個問題。

-1
NSSetUncaughtExceptionHandler(&HandleException); 
signal(SIGABRT, SignalHandler); 
signal(SIGILL, SignalHandler); 
signal(SIGSEGV, SignalHandler); 
signal(SIGFPE, SignalHandler); 
signal(SIGBUS, SignalHandler); 
signal(SIGPIPE, SignalHandler); 

這將適用於大多數情況。但我也試圖找到一種方法來捕捉所有崩潰。那麼,如果你comd +點擊這些信號來查看文件,你會發現有超過20種信號,我所做的是信號(,)所有類型的信號。這似乎有效,但也許還有一些崩潰無法收集。

5

NSSetUncaughtExceptionHandler只適用於NSExceptions。請參閱this SO答案以獲得精彩的解釋。

要捕獲Swift運行時錯誤,請執行SIGTRAP的信號處理程序。據我所知,Swift代碼將終止與SIGTRAP異常類型的程序,如果它在運行時檢測到意外情況,即只有SIGTRAP有助於捕獲Swift錯誤,像SIGSEGV,SIGBUS,SIGILL休息不起作用。 我在this apple鏈接中找到了該信息。

如果你的代碼是混合Objective-C和Swift,那麼實現NSSetUncaughtExceptionHandler和信號處理程序來處理崩潰。

有關理解和實施信號處理請參閱this鏈接。

希望這會有所幫助。

+2

我爲大多數信號(包括'SIGTRAP')添加了一個信號處理程序,但它不處理「致命錯誤:在解包可選值時意外發現零」。我還用'NSSetUncaughtExceptionHandler()'添加了一個異常處理程序...... –