¿Sin excepción stacktrace en la consola bajo Xcode 4.2 / iOS 5?
En Xcode 3.xy iOS 4, si se señala una excepción no controlada en el emulador, se produce un seguimiento de la pila de excepciones (similar a Java) en la salida de la consola.
Cuando levanto una excepción no controlada en iOS 5 bajo Xcode 4.2, ejecutando exactamente el mismo código de aplicación, no se produce el seguimiento de la pila. (Sí descubrí cómo establecer un punto de interrupción de excepción, pero eso no produce el rastreo en la consola).
¿Es esto simplemente una configuración de Xcode que necesito hacer en alguna parte, o una "característica" de Xcode 4 / iOS 5? ¿Hay alguna forma de restaurar este bit de funcionalidad?
Actualiza Desafortunadamente, agregando ununcaughtExceptionHandler
no funciona. Aquí está el controlador:
void uncaughtExceptionHandler(NSException *exception) {
NSLog(@"uncaughtExceptionHnadler -- Exception %@", [exception description]);
// Because iOS 5 doesn't provide a traceback, provide one here
NSLog(@"Stack trace: %@", [exception callStackSymbols]);
// Let Flurry look at the error
[FlurryAPI logError:@"Uncaught" message:@"Crash!" exception:exception];
}
(Resulta que ya estaba presente, para hacer lo Flurry, así que acabo de agregar el seguimiento de la pila).
Aquí es donde está habilitado (solo unas pocas líneas debajo de donde se declara el controlador):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Enable uncaught exception handler to dump stack and let Flurry log the exception
NSUncaughtExceptionHandler* hdlr = NSGetUncaughtExceptionHandler();
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
NSUncaughtExceptionHandler* newHdlr = NSGetUncaughtExceptionHandler();
// TODO: Test
NSException* ex = [NSException exceptionWithName:@"AssertionFailure" reason:@"Test" userInfo:nil];
@throw ex;
Establecí puntos de interrupción para permitirme verificar los dos valores de manejador recuperados. El primero es nulo y el segundo es una dirección aparentemente válida. Pero cuando se lanza la excepción de prueba, el controlador (en el simulador de iOS 5) nunca obtiene el control. (Aunque cuando ejecuto el simulador de iOS 4.2, sí obtiene el control).
AjusteNSExceptionHandlingMask
parentemente, @ no es posible en iPhone. El prereqExceptionHandling.framework
no está disponible
Esto funciona
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = -1;
@try {
retVal = UIApplicationMain(argc, argv, nil, nil);
}
@catch (NSException* exception) {
NSLog(@"Uncaught exception: %@", exception.description);
NSLog(@"Stack trace: %@", [exception callStackSymbols]);
}
[pool release];
return retVal;
}