Rien de ce que j'ai essayé ne résoudrait cela (j'ai essayé les deux compilateurs, les deux débogueurs, etc.) Après la mise à niveau de XCode pour la mise à jour iOS 5, aucune trace de pile ne semblait fonctionner.
Cependant, j'ai trouvé une solution efficace: créer mon propre gestionnaire d'exceptions (ce qui est également utile pour d'autres raisons). Tout d'abord, créez une fonction qui gérera l'erreur et la sortira sur la console (ainsi que tout ce que vous voulez en faire):
void uncaughtExceptionHandler(NSException *exception) {
NSLog(@"CRASH: %@", exception);
NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
// Internal error reporting
}
Ensuite, ajoutez le gestionnaire d'exceptions à votre délégué d'application:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
// Normal launch stuff
}
C'est tout!
Si cela ne fonctionne pas, il n'y a que deux raisons possibles :
- Quelque chose écrase votre
NSSetUncaughtExceptionHandler
appel (il ne peut y avoir qu'un seul gestionnaire pour l'ensemble de votre application). Par exemple, certaines bibliothèques tierces définissent leur propre uncaughtExceptionHandler. Alors, essayez de le définir à la FIN de votre didFinishLaunchingWithOptions
fonction (ou de désactiver sélectivement les bibliothèques tierces). Ou mieux encore, définissez un point de rupture symbolique NSSetUncaughtExceptionHandler
pour voir rapidement qui l'appelle. Ce que vous voudrez peut-être faire est de modifier votre version actuelle plutôt que d'en ajouter une autre.
- Vous ne rencontrez pas réellement d'exception (par exemple, ce
EXC_BAD_ACCESS
n'est pas une exception; merci aux commentaires de @Erik B, ci-dessous)
uncaughtExceptionHandler
routine n'est jamais invoquée.Il existe une option utile pour ajouter un point d'arrêt d'exception (en utilisant le + en bas du navigateur de point d'arrêt). Cela cassera sur toute exception (ou vous pouvez définir des conditions). Je ne sais pas si ce choix est nouveau dans la version 4.2 ou si je l'ai finalement remarqué en essayant de contourner le problème des symboles manquants.
Une fois que vous avez atteint ce point d'arrêt, vous pouvez utiliser le navigateur de débogage pour parcourir la pile d'appels, examiner les variables, etc. comme d'habitude.
Si vous voulez une pile d'appels symbolisés adaptée au copier / coller ou autre, gdb backtrace fonctionnera bien à partir de là:
(etc)
la source
Il y a une nouvelle fonctionnalité sur le débogueur. Vous pouvez définir un point d'arrêt chaque fois qu'une exception est levée et arrêter l'exécution à cet endroit, comme cela se produisait sur 4.0.
Sur le "Breakpoint Navigator", ajoutez un "Exception Breakpoint" et appuyez simplement sur "Done" dans la fenêtre des options.
C'est tout!
PS: Dans certains cas, il serait préférable de ne rompre que pour les exceptions Objective-C.
la source
Voici une autre solution, pas aussi élégante que la précédente, mais si vous n'avez pas ajouté de points d'arrêt ou de gestionnaires d'exception, cela ne peut être qu'une solution.
Lorsque l'application tombe en panne et que vous obtenez votre première pile d'appels bruts (en nombres hexadécimaux), tapez dans la console Xcode
info line *hex
(n'oubliez pas les0x
spécificateurs étoile et hexadécimal), par exemple:Si vous utilisez lldb , vous pouvez taper
image lookup -a hex
(sans étoile dans cette situation), et vous obtenez une sortie similaire.Avec cette méthode, vous pouvez passer du haut de la pile de jet (il y aura environ 5 à 7 propagateurs d'exceptions système) jusqu'à votre fonction qui a causé un plantage, et déterminer le fichier exact et la ligne de code.
De plus, pour un effet similaire, vous pouvez utiliser l'utilitaire atos dans le terminal, tapez simplement:
et vous obtenez une trace de pile symbolisée (au moins pour les fonctions, vous avez des symboles de débogage). Cette méthode est plus préférable, car vous n'avez pas pour chaque appel d'adresse
info line
, copiez simplement les adresses de la sortie de la console et collez-les dans le terminal.la source
Vous pouvez ajouter un point d' arrêt d'exception (en utilisant le + en bas du navigateur de point d'arrêt) et y ajouter l'action
bt
(cliquez sur le bouton Ajouter une action, sélectionnez Commande du débogueur, entrez «bt» dans le champ de texte). Cela affichera la trace de la pile dès qu'une exception est levée.la source
C'est un problème courant, ne pas obtenir de traces de pile dans 4.2. Vous pouvez essayer de permuter entre LLDB et GDB pour voir si vous obtenez de meilleurs résultats.
Déposez un rapport de bogue ici.
http://developer.apple.com/bugreporter/
ÉDITER:
Je crois que si vous revenez à LLVM GCC 4.2, vous ne verrez pas cela se produire. Cependant, vous risquez de perdre les fonctionnalités dont vous avez besoin.
la source
Utilisez ce code dans votre fonction principale:
la source
Au type d'invite de la console de débogage de Xcode:
Et cela vous montrera quelque chose comme:
la source
Réactiver 'Compile for Thumb' (configuration de débogage) a fonctionné pour moi.
la source