Пользовательский NSUncaughtExceptionHandler вызывает предыдущий обработчик исключений

Мое приложение включает в себя библиотеку отчетов о сбоях, которая использует NSSetUncaughtExceptionHandler чтобы поймать аварии. Мне нужно реализовать пользовательское действие (журнал аварий и отображение предупреждений) до \ после реализации отчетов о сбоях. Чтобы добиться этого, сначала я сохраню ссылку на предыдущий UncaughtExceptionHandler, используя NSGetUncaughtExceptionHandler(), а затем зарегистрировать мой пользовательский обработчик исключений и обработчик сигналов. В моем собственном обработчике я пытался выполнить предыдущий обработчик до \ после моих пользовательских действий, но это выдает сигнал SIGABRT для previousHandler(исключение) (в обоих случаях). Вот пример кода:

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 не вызывается, когда система выдает сигнал?

2 ответа

Не регистрируйте обработчики сигналов. Я должен немного запутать код, представленный ниже, но это из производственного приложения, которое есть в App Store:

Приложение AppDelegate:didFinishLaunchingWithOptions:

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

Обработчик:

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

    if (fabricHandler) {
        fabricHandler(exception);
    }
}

PreviousSignalHandler может 1) Сбросить все установленные обработчики сигналов 2) Прервать вызов

Одна из причин этого прервется. Таким образом, вы можете делать все, что хотите, и вызывать предыдущий обработчик.

НТН

Другие вопросы по тегам