2012-04-25 24 views
13

Próbuję zbudować własny sygnał i uncaught obsługi wyjątku dla iOS. W tym celu należy używać tych dwóch funkcji:EXC_BAD_ACCESS automatyczna obsługa

NSSetUncaughtExceptionHandler(/*handler*/); 

i

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

Moim problemem jest to, że nie mogę zrobić to praca z sygnałem EXC_BAD_ACCESS. Czy istnieje jakiś stały sygnał (np. SIGABRT, SIGBUS), aby złapać EXC_BAD_ACCESS? Jeśli nie, jak mogę sobie z tym poradzić? Niektóre narzędzia analizy awarii (lika PLCrashReporter, Crashlytics itp.) Mogą je śledzić ...

+1

Zobacz ten post: http://stackoverflow.com/questions/1128539/nssetuncaughtexceptionhandler-not-catch- all-errors-na-iphone – Lefteris

+0

cóż, już włączyłem SIGSEGV, ale nadal nie robi to EXC_BAD DOSTĘP:/hmmmm ... ale dzięki za komentarz! :) –

Odpowiedz

8

EXC_BAD_ACCESS nie generuje wyjątku, więc funkcja po raz pierwszy nie działa w przypadku. Generuje sygnał SIGSEGV lub SIGSEGV.

Proszę odnieść się do Handling unhandled exceptions and signals autorstwa Cocoa with Love.

Aktualizacja

Właśnie sprawdziłem kodu źródłowego LLDB. Może to być TARGET_EXC_BAD_ACCESS = 0x91.

W 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 

aw 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

:) dzięki za odpowiedź! Piszę mój "moduł" z tego samouczka i jak już skomentowałem moje pytanie wcześniej już obsługuję SIGSEV i SIGBUS, ale bez powodzenia. Nadal nie mogę obsłużyć EXC_BAD_ACCESS ... spróbuj czytać komentarze z tego tutoriala o kakao z miłością ... kilka osób ma ten sam problem co ja ... –

+0

Sprawdziłem kod źródłowy LLDB i zaktualizowałem moje wyniki w mojej odpowiedzi ... – Hailei

+0

DZIĘKI! naprawdę! :) To oczywiście może być rozwiązaniem tego problemu ... ale jestem teraz trochę zmieszany, ponieważ jestem początkującym dla tego, jak mogę sobie z tym poradzić? :) Wywołanie sygnału (0x91,/* handler) nie pomogło ... Muszę teraz wyglądać głupio :) –