2012-04-25 2 views
13

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

NSSetUncaughtExceptionHandler(/*handler*/); 

и

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

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

+1

Смотрите этот пост: http://stackoverflow.com/questions/1128539/nssetuncaughtexceptionhandler-not-catch- all-errors-on-iphone – Lefteris

+0

ну, я уже включил SIGSEGV, но он все еще не поймал EXC_BAD ACCESS:/hmmmm ... но спасибо за комментарий! :) –

ответ

8

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

Пожалуйста, обратитесь к Handling unhandled exceptions and signals от Cocoa with Love.

Update

Я только что проверил исходный код 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; 
} 
+0

:) спасибо, что ответили! Я пишу свой «модуль» из этого учебника, и, поскольку я уже прокомментировал мой вопрос раньше, я уже обрабатываю SIGSEV и SIGBUS, но не повезло. я все еще не могу обработать EXC_BAD_ACCESS ... попробуйте прочитать комментарии в этом учебнике по какао с любовью ... у немногих людей есть такая же проблема, как у меня ... –

+0

Посмотрел исходный код LLDB и обновил мои результаты в своем ответе ... – Hailei

+0

СПАСИБО! действительно! :) это, очевидно, может быть решением этой проблемы ... но я сейчас запутался, так как я вроде как новичок в этом, как я могу справиться с этим? :) сигнал вызова (0x91,/* обработчик) не помог ... я должен выглядеть глупо сейчас :) –

Смежные вопросы