在Objective-C中,NSSetUncaughtExceptionHandler
可以註冊一些功能來對異常進行最後一分鐘的日誌記錄。如何捕捉Swift崩潰並執行一些日誌記錄
這沒有發現Swift崩潰的東西。
是否可以在Swift中的全局級別執行此類操作?例如。如果在Swift代碼中發生崩潰,請執行一些日誌記錄,如強制解包無可選項。
具體來說,我正在做一個實用程序來記錄應用程序中的網絡流量,如果發生崩潰,我想將我的內存數據刷新到磁盤。
在Objective-C中,NSSetUncaughtExceptionHandler
可以註冊一些功能來對異常進行最後一分鐘的日誌記錄。如何捕捉Swift崩潰並執行一些日誌記錄
這沒有發現Swift崩潰的東西。
是否可以在Swift中的全局級別執行此類操作?例如。如果在Swift代碼中發生崩潰,請執行一些日誌記錄,如強制解包無可選項。
具體來說,我正在做一個實用程序來記錄應用程序中的網絡流量,如果發生崩潰,我想將我的內存數據刷新到磁盤。
有多個方面的解答,讓我嘗試回答他們:
NSSetUncaughtExceptionHandler
僅捕獲未捕獲的異常這是唯一可能崩潰的一小部分。到您的具體情況:你不應該這樣做,而不是嘗試。這可能會導致用戶數據損壞或更多數據丟失。該應用程序崩潰嚴重的問題,而不是解決這個問題。
NSSetUncaughtExceptionHandler(&HandleException);
signal(SIGABRT, SignalHandler);
signal(SIGILL, SignalHandler);
signal(SIGSEGV, SignalHandler);
signal(SIGFPE, SignalHandler);
signal(SIGBUS, SignalHandler);
signal(SIGPIPE, SignalHandler);
這將適用於大多數情況。但我也試圖找到一種方法來捕捉所有崩潰。那麼,如果你comd +點擊這些信號來查看文件,你會發現有超過20種信號,我所做的是信號(,)所有類型的信號。這似乎有效,但也許還有一些崩潰無法收集。
NSSetUncaughtExceptionHandler
只適用於NSExceptions。請參閱this SO答案以獲得精彩的解釋。
要捕獲Swift運行時錯誤,請執行SIGTRAP
的信號處理程序。據我所知,Swift代碼將終止與SIGTRAP
異常類型的程序,如果它在運行時檢測到意外情況,即只有SIGTRAP
有助於捕獲Swift錯誤,像SIGSEGV
,SIGBUS
,SIGILL
休息不起作用。 我在this apple鏈接中找到了該信息。
如果你的代碼是混合Objective-C和Swift,那麼實現NSSetUncaughtExceptionHandler
和信號處理程序來處理崩潰。
有關理解和實施信號處理請參閱this鏈接。
希望這會有所幫助。
我爲大多數信號(包括'SIGTRAP')添加了一個信號處理程序,但它不處理「致命錯誤:在解包可選值時意外發現零」。我還用'NSSetUncaughtExceptionHandler()'添加了一個異常處理程序...... –
我想也許蘋果公司沒有像Refactor一樣爲此工作。 – Lumialxk