Пользовательский 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");
}
- Как я могу выполнить предыдущий обработчик без бросков сигнала?
- Есть идеи почему
SignalHandler
не вызывается, когда система выдает сигнал?
2 ответа
Не регистрируйте обработчики сигналов. Я должен немного запутать код, представленный ниже, но это из производственного приложения, которое есть в App Store:
Приложение AppDelegate:didFinishLaunchingWithOptions:
fabricHandler = NSGetUncaughtExceptionHandler();
NSSetUncaughtExceptionHandler(&customUncaughtExceptionHandler);
Обработчик:
void customUncaughtExceptionHandler(NSException *exception) {
// Custom handling
if (fabricHandler) {
fabricHandler(exception);
}
}
PreviousSignalHandler может 1) Сбросить все установленные обработчики сигналов 2) Прервать вызов
Одна из причин этого прервется. Таким образом, вы можете делать все, что хотите, и вызывать предыдущий обработчик.
НТН