xcode4.2 - descargar - xcode for windows
¿Sin excepción stacktrace en la consola bajo Xcode 4.2/iOS 5? (3)
Bajo Xcode 3.xy iOS 4, si se señala una excepción no controlada en el emulador hay un seguimiento de pila de excepción (similar a Java) producido en la salida de la consola.
Cuando presento una excepción no controlada en iOS 5 bajo Xcode 4.2, ejecutando exactamente el mismo código de aplicación, el seguimiento de la pila no ocurre. (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 algún lugar, o una "característica" de Xcode 4 / iOS 5? ¿Hay alguna manera de restaurar este poco de funcionalidad?
Actualizar
Desafortunadamente, agregar uncaughtExceptionHandler
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 de Flurry, así que acabo de agregar el seguimiento de pila).
Aquí es donde está habilitado (solo unas líneas debajo 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 controlador 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 iOS 5) nunca obtiene el control. (Aunque cuando corro en el simulador iOS 4.2, obtengo el control).
Establecer NSExceptionHandlingMask
aparentemente no es posible en iPhone. El marco de ExceptionHandling.framework
no está disponible.
Actualización 2
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;
}
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;
}
Para ARC:
int main(int argc, char *argv[]) {
int retVal = -1;
@autoreleasepool {
@try {
retVal = UIApplicationMain(argc, argv, nil, nil);
}
@catch (NSException* exception) {
NSLog(@"Uncaught exception: %@", exception.description);
NSLog(@"Stack trace: %@", [exception callStackSymbols]);
}
}
return retVal;
}
Todavía esperando algún tipo de explicación de por qué el volcado predeterminado ya no funciona y / o por qué (aún más grave) uncaughtExceptionHandler no funciona. Sin embargo, aparentemente este problema solo afecta al emulador.
actualizar:
Se ha señalado que si va a Producto -> Esquema -> Editar esquema, seleccione "Ejecutar (depurar)", seleccione la pestaña "Diagnóstico" y haga clic en "Registrar excepciones", esto restaurará el registro de excepción predeterminado de Xcode que falta. , posiblemente (aún no lo he probado), eliminando la necesidad del hack anterior.
Tuve el mismo problema, y funcionó ''Recopilar para pulgar''. Nota: solo lo volví a activar para la configuración de depuración, por razones obvias.