Objective-Cでは、NSSetUncaughtExceptionHandler
はいくつかの機能を登録して、例外に関する最後のロギングを行うことができます。
これは、Swiftからのクラッシュをキャッチしません。
Swiftのグローバルレベルでこのようなことをすることは可能ですか?例えば。 Swiftコードでクラッシュが発生した場合、オプションのnilを強制的にアンラップするように、ログを記録します。
具体的には、アプリでネットワークトラフィックをログに記録するユーティリティを実行しています。クラッシュが発生した場合は、メモリ内のデータをディスクにフラッシュしたいと思います。
NSSetUncaughtExceptionHandler
はNSExceptionsでのみ機能します。見事な説明については this SO の回答を参照してください。
Swiftランタイムエラーをキャッチするには、SIGTRAP
のシグナルハンドラを実装します。私の知る限り、SwiftコードはSIGTRAP
例外タイプは、実行時に予期しない状態を検出した場合、つまりSIGTRAP
のみがキャッチに役立ちますSwiftエラー、SIGSEGV
、SIGBUS
、SIGILL
動作しません。この情報は this Apple リンクで見つかりました。
コードがObjective-CとSwiftの両方である場合は、NSSetUncaughtExceptionHandler
とシグナルハンドラーの両方を実装してクラッシュを処理します。
シグナル処理の理解と実装については、 this リンクを参照してください。
お役に立てれば。
Swift 5では、アプリのクラッシュを次のように処理できます
NSSetUncaughtExceptionHandler { (exception) in
let stack = exception.callStackReturnAddresses
print("Stack trace: \(stack)")
}
NSSetUncaughtExceptionHandler(&HandleException);
signal(SIGABRT, SignalHandler);
signal(SIGILL, SignalHandler);
signal(SIGSEGV, SignalHandler);
signal(SIGFPE, SignalHandler);
signal(SIGBUS, SignalHandler);
signal(SIGPIPE, SignalHandler);
これはほとんどの状況で機能します。しかし、私はすべてのクラッシュをキャッチする方法も探しています。まあ、それらの信号にコード+クリックしてドキュメントを表示すると、20種類以上の信号があることがわかります。私がやったことは、signal(、)すべてのほとんどすべての種類の信号。それはうまくいくようですが、おそらくいくつかのクラッシュは収集できません。
あなたの質問には複数の側面があります。それらに答えてみましょう:
NSSetUncaughtExceptionHandler
は、発生する可能性のあるクラッシュのごく一部にすぎない、キャッチされない例外のみをキャッチします。あなたの特定のシナリオに:あなたはそれをするべきではなく、しようとしないでください。これにより、ユーザーデータが破損したり、さらに多くのデータが失われる可能性があります。アプリは深刻な問題で激しくクラッシュし、問題を修正しました。