web-dev-qa-db-ja.com

Swiftクラッシュをキャッチしてロギングを行う方法

Objective-Cでは、NSSetUncaughtExceptionHandlerはいくつかの機能を登録して、例外に関する最後のロギングを行うことができます。

これは、Swiftからのクラッシュをキャッチしません。

Swiftのグローバルレベルでこのようなことをすることは可能ですか?例えば。 Swiftコードでクラッシュが発生した場合、オプションのnilを強制的にアンラップするように、ログを記録します。

具体的には、アプリでネットワークトラフィックをログに記録するユーティリティを実行しています。クラッシュが発生した場合は、メモリ内のデータをディスクにフラッシュしたいと思います。

15
Ken Ko

NSSetUncaughtExceptionHandlerはNSExceptionsでのみ機能します。見事な説明については this SO の回答を参照してください。

Swiftランタイムエラーをキャッチするには、SIGTRAPのシグナルハンドラを実装します。私の知る限り、SwiftコードはSIGTRAP例外タイプは、実行時に予期しない状態を検出した場合、つまりSIGTRAPのみがキャッチに役立ちますSwiftエラー、SIGSEGVSIGBUSSIGILL動作しません。この情報は this Apple リンクで見つかりました。

コードがObjective-CとSwiftの両方である場合は、NSSetUncaughtExceptionHandlerとシグナルハンドラーの両方を実装してクラッシュを処理します。

シグナル処理の理解と実装については、 this リンクを参照してください。

お役に立てれば。

9
SHN

Swift 5では、アプリのクラッシュを次のように処理できます

NSSetUncaughtExceptionHandler { (exception) in
        let stack = exception.callStackReturnAddresses
        print("Stack trace: \(stack)")

    }
2
Zain Anjum
NSSetUncaughtExceptionHandler(&HandleException);
signal(SIGABRT, SignalHandler);
signal(SIGILL, SignalHandler);
signal(SIGSEGV, SignalHandler);
signal(SIGFPE, SignalHandler);
signal(SIGBUS, SignalHandler);
signal(SIGPIPE, SignalHandler);

これはほとんどの状況で機能します。しかし、私はすべてのクラッシュをキャッチする方法も探しています。まあ、それらの信号にコード+クリックしてドキュメントを表示すると、20種類以上の信号があることがわかります。私がやったことは、signal()すべてのほとんどすべての種類の信号。それはうまくいくようですが、おそらくいくつかのクラッシュは収集できません。

1
Benjamin

あなたの質問には複数の側面があります。それらに答えてみましょう:

  1. NSSetUncaughtExceptionHandlerは、発生する可能性のあるクラッシュのごく一部にすぎない、キャッチされない例外のみをキャッチします。
  2. Objective-Cの例外は致命的であると定義されており、キャッチすることはお勧めできません。また、Objective-CとSwiftコードを含む、非同期セーフコードを実行することはお勧めしません。
  3. クラッシュをキャッチするには、シグナルハンドラーをセットアップして、クラッシュ時に非同期セーフコードのみを実行する必要があります。これは、Cのごく一部にすぎません。特に、クラッシュ時に新しいメモリを割り当てることはできません。
  4. アプリがクラッシュしたとき、それは非常に不安定なコードであり、オブジェクトまたは変数の参照は完全に予期しないものを指し示している可能性があることを覚えておいてください。したがって、クラッシュ時には何もすべきではありません。
  5. クラッシュを処理するための最良のオープンソースの方法は、クラッシュ時にコードを呼び出すメソッドも提供する PLCrashReporter を使用することです。ただし、これも非同期セーフでなければなりません。

あなたの特定のシナリオに:あなたはそれをするべきではなく、しようとしないでください。これにより、ユーザーデータが破損したり、さらに多くのデータが失われる可能性があります。アプリは深刻な問題で激しくクラッシュし、問題を修正しました。

1
Kerni