2016-03-31 15 views
11

Objective-Cでは、NSSetUncaughtExceptionHandlerは、例外に関する最後のログ記録を行うためにいくつかの機能を登録できます。スウィフトクラッシュを捕捉してログを記録する方法

これはSwiftからクラッシュするものを捕まえません。

Swiftのグローバルレベルでこれを行うことは可能ですか?例えば。スウィフトコードでクラッシュが発生した場合、いくつかのロギングを行います。強制アンラッピングはオプションではありません。

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

+0

私はおそらく、AppleがRefactorのようにこのために働いていなかったと思います。 – Lumialxk

答えて

1

ご質問複数の側面がありますが、私はそれらに答えることを試してみましょう:

  1. NSSetUncaughtExceptionHandlerだけでクラッシュする可能性のほんの一部でキャッチされない例外をキャッチします。 Objective-Cの中
  2. 例外致命的になるように定義されており、それがクラッシュをキャッチするために任意のObjective-Cのとスウィフトコード
  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); 

これはほとんどの状況で機能します。しかし、私はまた、すべてのクラッシュをキャッチする方法を見つけることを試みています。さて、あなたがそれらの信号をクリックしてドキュメントを見ると、20種類以上の信号があることがわかります。信号()はすべての種類の信号です。それはうまくいくと思われますが、まだまだクラッシュすることはありません。

5

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

スウィフトランタイムエラーをキャッチするには、SIGTRAPのシグナルハンドラを実装します。私が知る限り、スウィフトコードはSIGTRAP例外タイプのプログラムを終了させます。実行時に予期しない条件が検出された場合、SIGTRAPSIGSEGVSIGBUSSIGILLなどのSwiftエラーを捕捉するのに役立ちます。 この情報はthis appleというリンクに見つかりました。

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

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

これが役に立ちます。

+2

私はほとんどのシグナル( 'SIGTRAP'を含む)のシグナルハンドラを追加しましたが、"致命的なエラー:オプション値をアンラッピングしている間に予期せぬ発見なし "を処理しません。私はまた 'NSSetUncaughtExceptionHandler()'で例外ハンドラを追加しました... –

関連する問題