web-dev-qa-db-ja.com

EXC_BAD_ACCESSをキャッチまたは処理する方法はありますか?

私の知る限り、EXC_BAD_ACCESSは、不良メモリにアクセスしようとすると発生します(間違っている場合は、遠慮なく修正してください)。

アプリ全体の失敗を防ぐために、Javatry-catchのようにそれをキャッチする方法はありますか?

21
Kirsten Koa

いいえ、 EXC_BAD_ACCESSは、物事がレールから大きく外れたことを意味します。プログラムが無効なメモリアドレスにアクセスしようとしています。つまりメモリが破損しており、予測可能な回復はありません。

メモリ管理の問題である可能性があります。問題を再現できる場合は、NSZombiesをオンにして、何が起こるかを確認してください。または、ここにバックトレースを投稿してください。

Try-catchスタイルの例外は、iOS/Cocoaでも回復できないことに注意してください。例外は、回復可能なエラー処理には使用されません。それがNSErrorの目的です。

27
bbum

シグナルハンドラを使用して、時々mainでキャッチできます。ただし、ログに記録する以外は、多くのことを行うことはできません。

3
Hot Licks

トライキャッチを使用できますが、最初に問題の原因を知る必要があります。現在のビルドでNSZombieを有効にして、エラーをキャッチし、必要をなくすことができます。現在のスキームを編集し、NSZombieを有効にします。

  • 更新* Swift2 +は現在、優れたエラー処理を備えており、チェックする価値があります。 迅速なエラー処理
3
Mark McCorkle

新しいCライブラリ SignalRecovery は、プログラムがEXC_BAD_ACCESSなどのオペレーティングシステムの例外から回復できるようにします。 IOS/MacOS/Linuxで使用できます。

サンプルコード:

signal_try(label) {
    // Add your code need try.
    int* ptr = NULL;
    *ptr = 0;
}
signal_catch(label) {
    // Add your code to process exceptions, or do nothing.
    siginfo_t* info = signal_info();
}
signal_end(label)
// Continue run
3
Charles Wang