4

NSSetUncaughtExceptionHandler私のアプリには、クラッシュをキャッチするために使用するクラッシュ レポート ライブラリが含まれています。クラッシュ レポートの実装の前後に、カスタム アクション (ログ クラッシュと表示アラート ビュー) を実装する必要があります。この動作を実現するには、まず を使用して以前の UncaughtExceptionHandler への参照を保持しNSGetUncaughtExceptionHandler()、カスタム例外ハンドラーとシグナル ハンドラーを登録します。カスタム ハンドラーで、カスタム アクションの前/後に前のハンドラーを実行しようとしましたが、これにより、previousHandler(exception) のシグナル SIGABRT がスローされます (両方の場合)。コード例は次のとおりです。

static NSUncaughtExceptionHandler *previousHandler;

void InstallUncaughtExceptionHandler()
{
    // keep reference to previous handler
    previousHandler = NSGetUncaughtExceptionHandler();

    // register my custom exception handler
    NSSetUncaughtExceptionHandler(&HandleException);
    signal(SIGABRT, SignalHandler);
    signal(SIGILL, SignalHandler);
    signal(SIGSEGV, SignalHandler);
    signal(SIGFPE, SignalHandler);
    signal(SIGBUS, SignalHandler);
    signal(SIGPIPE, SignalHandler);
}

void HandleException(NSException *exception)
{
    // execute previous handler 
    previousHandler(exception);
    // my custom actions
}

void SignalHandler(int signal)
{
    NSLog(@"SignalHandler");
}
  1. シグナルをスローせずに前のハンドラーを実行するにはどうすればよいですか?
  2. SignalHandlerシステムがシグナルをスローしたときに呼び出されない理由はありますか?
4

2 に答える 2

3

シグナルハンドラを登録しないでください。以下に示すコードを少し難読化する必要がありますが、これは App Store にある製品アプリのものです。

AppDelegate アプリケーション:didFinishLaunchingWithOptions:

fabricHandler = NSGetUncaughtExceptionHandler();
NSSetUncaughtExceptionHandler(&customUncaughtExceptionHandler);

ハンドラ:

void customUncaughtExceptionHandler(NSException *exception) {
    // Custom handling

    if (fabricHandler) {
        fabricHandler(exception);
    }
}
于 2015-11-02T08:46:27.180 に答える