Sous Xcode 3.x et iOS 4, si une exception non gérée s'est signalé dans l'émulateur il y a une trace de pile d'exception (similaire à Java) produit à la sortie de la console.
Quand je lève une exception non gérée dans iOS 5 sous Xcode 4.2, l'exécution de l'exacte même le code de l'application, la trace de la pile ne se produit pas. (Je n'ai trouver comment faire pour définir un point d'arrêt exception, mais qui ne produit pas le traceback dans la console.)
Est-ce qu'une Xcode réglage j'ai besoin de faire quelque part, ou d'une "fonctionnalité" de Xcode 4/iOS 5? Est-il un moyen de restaurer cette fonctionnalité?
Mise à jour
Malheureusement, l'ajout d'un uncaughtExceptionHandler
ne fonctionne pas. Ici, c'est le gestionnaire de:
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];
}
(Il s'avère qu'il était déjà présent, pour faire le Déluge de chose, donc j'ai juste ajouté la trace de la pile.)
C'est là où c'est permis (juste quelques lignes ci-dessous où le gestionnaire est déclarée):
- (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;
Je définir des points d'arrêt pour me permettre de vérifier les deux extraites du gestionnaire de valeurs. Le premier est nul, et le second est apparemment une adresse valide. Mais lorsque le test exception est levée, le gestionnaire (dans iOS 5 simulateur) ne fait jamais de contrôle. (Mais quand je le lance sur l'iOS 4.2 simulateur il ne se contrôle.)
Paramètre NSExceptionHandlingMask
n'est apparemment pas possible sur iPhone. Le prereq ExceptionHandling.framework
n'est pas disponible.
Mise à jour 2
Ceci fonctionne:
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;
}