2012-04-25 19 views
13

Sto provando a creare il mio segnale e gestore di eccezioni non rilevate per iOS. Per fare questo io uso queste due funzioni:EXC_BAD_ACCESS gestione automatica

NSSetUncaughtExceptionHandler(/*handler*/); 

e

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

mio problema è che non riesco a farlo funzionare con il segnale EXC_BAD_ACCESS. C'è qualche costante di segnale (come SIGABRT, SIGBUS) per catturare l'EXC_BAD_ACCESS? Se no, come posso gestirlo? Alcuni strumenti di analisi degli arresti anomali (lika PLCrashReporter, Crashlytics ecc.) Possono rintracciarlo ...

+1

vedi questo post: http://stackoverflow.com/questions/1128539/nssetuncaughtexceptionhandler-not-catch- all-errors-on-iphone – Lefteris

+0

beh, ho già incluso SIGSEGV ma ancora non cattura EXC_BAD ACCESS:/hmmmm ... ma grazie per il commento! :) –

risposta

8

EXC_BAD_ACCESS non genera un'eccezione quindi la prima funzione non funziona con il caso. Genera un segnale SIGSEGV o SIGBUS.

Si prega di fare riferimento a Handling unhandled exceptions and signals di Cocoa with Love.

Aggiornamento

Ho appena controllato il codice sorgente di LLDB. Potrebbe essere TARGET_EXC_BAD_ACCESS = 0x91.

In 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 

e in 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

:) grazie per la risposta! sto scrivendo il mio "modulo" da questo tutorial e come ho già commentato la mia domanda in precedenza sto già gestendo SIGSEV e SIGBUS ma senza fortuna. non riesco ancora a gestire EXC_BAD_ACCESS ... prova a leggere i commenti all'interno di quel tutorial sul cacao con amore ... poche persone hanno lo stesso problema di me ... –

+0

Cerca nel codice sorgente di LLDB e aggiorno le mie conclusioni nella mia risposta ... – Hailei

+0

GRAZIE! veramente! :) questo ovviamente può essere una soluzione a questo problema ... ma sono un po 'confuso ora, dal momento che sono una specie di novizio per questo, come posso gestirlo? :) il segnale di chiamata (0x91,/* handler) non ha aiutato ... devo sembrare stupido ora :) –

Problemi correlati