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

Мое приложение включает библиотеку отчетов о сбоях, которая использует NSSetUncaughtExceptionHandler для обнаружения сбоев. Мне нужно реализовать настраиваемое действие (сбой журнала и отображение предупреждений) до\после реализации отчета о сбое. Чтобы добиться такого поведения, сначала я сохраняю ссылку на предыдущий UncaughtExceptionHandler, используя NSGetUncaughtExceptionHandler(), а затем регистрирую свой собственный обработчик исключений и обработчик сигналов. В моем пользовательском обработчике я пытался выполнить предыдущий обработчик до\после моих пользовательских действий, но это выдает сигнал 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 не вызывается, когда система выдает сигнал?

person Tsahi Deri    schedule 02.11.2015    source источник


Ответы (2)


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

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

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

Обработчик:

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

    if (fabricHandler) {
        fabricHandler(exception);
    }
}
person Avi    schedule 02.11.2015
comment
Я также добавил оператор «если», но он все равно разбился. Вы думаете, что обработчики сигналов вызывают проблему? - person Tsahi Deri; 02.11.2015
comment
Попробуйте без них. Они не нужны, так как обработчики по умолчанию вызывают то, что возвращает NSGetUncaughtExceptionHandler(). Возможно, вы создаете какой-то цикл, но я не уверен. - person Avi; 02.11.2015

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

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

ХТН

person Hemant Kumar    schedule 22.12.2017