51 votes

Trace de pile ou plus d'informations sur les exceptions non gérées dans Xcode/iPhone

Pardonnez mon ignorance, mais quelque chose me chiffonne à propos du débogueur de Xcode lors de l'exécution d'applications iPhone dans le simulateur d'iPhone.

Parfois, lorsque je fais une erreur dans Interface Builder, j'obtiens une exception non gérée au moment de l'exécution et je suis renvoyé dans Xcode. La seule chose que je vois est une simple ligne "uncaught exception" ou quelque chose comme ça. D'après ce que je peux voir, il n'y a aucune information supplémentaire, et encore moins une trace de pile ou quoi que ce soit d'autre d'utile.

Je développe avec Visual Studio depuis une dizaine d'années et j'ai l'habitude d'obtenir un bon suivi de pile et des informations complètes sur les exceptions lorsque quelque chose comme ça se produit.

Je suis sûr que je rate simplement quelque chose de très évident... J'espère...

73voto

Brad Larson Points 122629

Si vous ajoutez deux points d'arrêt, vous devriez être en mesure de déboguer ces exceptions. Pour ce faire, allez dans Run | Show | Breakpoints et créez deux points d'arrêt globaux (je les fais globalement car ils sont très utiles dans toutes mes applications). Le premier doit être nommé "objc_exception_throw" et son emplacement doit être "libobjc.A.dylib". La seconde devrait être "-[NSException raise]" et son emplacement devrait être "CoreFoundation".

Maintenant, si vous commencez à déboguer votre application avec des points d'arrêt activés, elle devrait s'interrompre au lancement de ces exceptions. Vous devriez alors être en mesure de voir la chaîne d'événements qui a conduit à l'exception dans le débogueur.

3voto

Michael G. Emmons Points 16681

L'absence de trace de la pile est généralement indiquant un problème avec LLDB (débogueur). J'adore LLDB, mais lorsqu'il s'agit d'afficher les traces de la pile et de déboguer sur l'exception plutôt que sur le principal dans les applications iOS, c'est une vraie plaie, et ce depuis quelques versions maintenant. Je ne sais pas pourquoi Apple n'a pas encore réglé ce problème. Pour le corriger, il faut procéder en deux étapes :

  1. Modifiez votre schéma actuel et sous l'onglet "Run", changez le débogueur de LLDB à GDB.
  2. Aller à https://developer.apple.com/bugreporter/ et signaler le bogue pour qu'Apple le corrige.

2voto

Ben Gotow Points 7627

Hey activa - pour plus d'informations sur les exceptions d'exécution, vous devriez pouvoir ouvrir la console du débogueur et voir plus d'informations. Je suppose que vous l'avez déjà fait, mais au cas où, vous pouvez y accéder en sélectionnant Exécuter -> Console dans le menu. Je ne sais pas pourquoi elle ne s'affiche pas automatiquement !

1voto

Remus Rusanu Points 159382

Vous pouvez envelopper votre UIApplicationMain dans un try/catch :

int main(int argc, char *argv[]) {
    int retVal;
    NSAutoreleasePool * pool;
    @try
    {
    pool = [[NSAutoreleasePool alloc] init];
    retVal = UIApplicationMain(argc, argv, nil, nil);
    }
    @catch(NSException* e)
    {
        NSLog(@"%@", e.reason);
    }
    @finally
    {
    [pool release];
    }
    return retVal;
}

Vous devriez également vous pencher sur la mise en place d'un gestionnaire d'assertion pendant le débogage : NSAssertionHandler .

Mise à jour : et aussi le gestionnaire d'exceptions non gérées : NSSetUncaughtExceptionHandler

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