48 votes

Pas de trace de pile d'exception dans la console sous Xcode 4.2/iOS 5?

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;
}

36voto

Hot Licks Points 25075

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;
}

Pour l'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;
}

Toujours en attente pour certains type d'explication du pourquoi de l'image par défaut ne fonctionne plus et/ou pourquoi (plus grave encore) uncaughtExceptionHandler ne fonctionne pas. Cependant, apparemment ce problème n'affecte que l'émulateur.

mise à jour:

Il a été souligné que, si vous allez à la Produit -> Système -> Modifier le Schéma, sélectionnez "Exécuter (Debug)", sélectionnez le "Diagnostic" de l'onglet et cliquez sur "Journal d'Exceptions", cela permettra de restaurer le manque Xcode par défaut de l'enregistrement d'exception, peut-être (je n'ai pas encore essayé), éliminant le besoin pour le hack.

2voto

Yahia Points 49011

C'est un problème connu... pour des solutions de contournement, voir ici et ici.

Une autre option pourrait être de

defaults write NSGlobalDomain NSExceptionHandlingMask 63

Bien qu'il soit généralement pour OSX, il peut aider lors de l'utilisation de l'émulateur - je ne peux pas l'essayer dès maintenant :-(

1voto

Bradweiser86 Points 21

J'ai eu le même problème, pour le passage de la Compilation de Pouce " de retour sur fonctionné pour moi. Note: je ne me suis tourné sur le dos pour la configuration Debug, pour des raisons évidentes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X