2012-04-25 25 views
13

Estoy tratando de construir mi propia señal y controlador de excepciones no detectadas para iOS. Para ello utilizo estos dos funciones:EXC_BAD_ACCESS manejo automático

NSSetUncaughtExceptionHandler(/*handler*/); 

y

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

Mi problema es que no puedo hacer que funcione con una señal EXC_BAD_ACCESS. ¿Hay alguna constante de señal (como SIGABRT, SIGBUS) para capturar EXC_BAD_ACCESS? Si no, ¿cómo puedo manejarlo? Algunas herramientas de análisis de fallos (lika PLCrashReporter, Crashlytics, etc.) pueden rastrearlo ...

+1

ver este mensaje: http://stackoverflow.com/questions/1128539/nssetuncaughtexceptionhandler-not-catch- all-errors-on-iphone – Lefteris

+0

bueno, ya he incluido SIGSEGV pero todavía no captura EXC_BAD ACCESS:/hmmmm ... ¡pero gracias por tu comentario! :) –

Respuesta

8

EXC_BAD_ACCESS no genera una excepción por lo que su primera función no funciona con el caso. Genera una señal SIGSEGV o SIGBUS.

Consulte Handling unhandled exceptions and signals por Cocoa with Love.

actualización

acabo de revisar el código fuente de LLDB. Puede ser TARGET_EXC_BAD_ACCESS = 0x91.

En 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 

y en 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

:) gracias por responder! Estoy escribiendo mi "módulo" de este tutorial y como ya comenté mi pregunta anteriormente, ya estoy manejando SIGSEV y SIGBUS pero sin suerte. Todavía no puedo manejar EXC_BAD_ACCESS ... intente leer comentarios con ese tutorial sobre cocoa con amor ... Pocas personas tienen el mismo problema que yo ... –

+0

Miré el código fuente de LLDB y actualicé mis hallazgos en mi respuesta ... – Hailei

+0

¡GRACIAS! ¡De Verdad! :) Esto, obviamente, puede ser una solución a este problema ... pero estoy un poco confundido ahora, ya que soy un novato en esto, ¿cómo puedo manejarlo? :) la señal de llamada (manejador 0x91,/*) no ayudó ... debo parecer estúpido ahora :) –