Подтвердить что ты не робот

Автоматическая обработка EXC_BAD_ACCESS

Я пытаюсь создать собственный сигнал и обработчик исключений для iOS. Для этого я использую эти две функции:

NSSetUncaughtExceptionHandler(/*handler*/); 

и

signal(/*signal const*/, /*signal handler*/);

Моя проблема в том, что я не могу заставить ее работать с сигналом EXC_BAD_ACCESS. Есть ли какая-то постоянная сигнала (например, SIGABRT, SIGBUS), чтобы поймать EXC_BAD_ACCESS? Если нет, как я могу справиться с этим? Некоторые инструменты анализа сбоев (lika PLCrashReporter, Crashlytics и т.д.) Могут отслеживать его...

4b9b3361

Ответ 1

EXC_BAD_ACCESS не генерирует исключение, поэтому первая функция не работает с этим случаем. Он генерирует сигнал SIGSEGV или SIGBUS.

Обратитесь к Обработка необработанных исключений и сигналов с помощью Cocoa с любовью.

Обновление

Я только что проверил исходный код LLDB. Это может быть TARGET_EXC_BAD_ACCESS= 0x91.

В RNBRemote.h:

/* We translate the /usr/include/mach/exception_types.h exception types
   (e.g. EXC_BAD_ACCESS) to the fake BSD signal numbers that gdb uses
   in include/gdb/signals.h (e.g. TARGET_EXC_BAD_ACCESS).  These hard
   coded values for TARGET_EXC_BAD_ACCESS et al must match the gdb
   values in its include/gdb/signals.h.  */

#define TARGET_EXC_BAD_ACCESS      0x91
#define TARGET_EXC_BAD_INSTRUCTION 0x92
#define TARGET_EXC_ARITHMETIC      0x93
#define TARGET_EXC_EMULATION       0x94
#define TARGET_EXC_SOFTWARE        0x95
#define TARGET_EXC_BREAKPOINT      0x96

и в RNBRemote.cpp:

// Translate any mach exceptions to gdb versions, unless they are
// common exceptions like a breakpoint or a soft signal.
switch (tid_stop_info.details.exception.type)
{
    default:                    signum = 0; break;
    case EXC_BREAKPOINT:        signum = SIGTRAP; break;
    case EXC_BAD_ACCESS:        signum = TARGET_EXC_BAD_ACCESS; break;
    case EXC_BAD_INSTRUCTION:   signum = TARGET_EXC_BAD_INSTRUCTION; break;
    case EXC_ARITHMETIC:        signum = TARGET_EXC_ARITHMETIC; break;
    case EXC_EMULATION:         signum = TARGET_EXC_EMULATION; break;
    case EXC_SOFTWARE:
        if (tid_stop_info.details.exception.data_count == 2 &&
            tid_stop_info.details.exception.data[0] == EXC_SOFT_SIGNAL)
            signum = tid_stop_info.details.exception.data[1];
        else
            signum = TARGET_EXC_SOFTWARE;
        break;
}