2009-09-03 6 views
8

Xcode/objectif c n'imprime pas vraiment une trace de pile utile. Mon appli se bloque quelque part, et la fichue chose me donne seulement des chiffres comme 45353453, 34524323, 6745345353, 457634524234. Pas utile du tout.Un moyen facile d'imprimer la trace de la pile actuelle d'une application?

Donc je veux faire un NSLog(); au début de chaque méthode que j'ai dans mon application entière. Mais peut-être y a-t-il un moyen plus simple de découvrir la véritable trace de pile, humainement lisible? Non seulement sur le lancement de l'application ou de crash, mais tout le temps, sur chaque activité qui se passe? Cela aiderait beaucoup à déboguer.

+0

vous pouvez suivre la trace de la pile dans le débogueur, il devrait vous prendre au dernier appel de méthode avant l'accident, je pense – Daniel

+0

Non, les informations du débogueur ne sont pas vraiment utiles. –

+1

Pourquoi les informations du débogueur ne sont-elles pas utiles? Si vous démarrez votre application dans le débogueur et qu'elle se bloque, le débogueur doit présenter une belle trace de pile que vous pouvez parcourir pour voir chaque ligne appelée. Si votre application s'arrête sur une exception, consultez la réponse d'alex_c pour savoir comment déboguer cela. –

Répondre

1

Il n'y a vraiment pas moyen de le faire de manière fiable à partir de l'application. Si votre application plante et ne donne pas de symboles, il semble que vous exécutiez une version dépouillée et non la version de débogage?

Si vous avez la version unstripped assis autour, vous pouvez établir une corrélation entre entre ces chiffres et le nom réel du cadre de pile en utilisant la commande atos (voir man atos dans le Terminal ou rechercher atos dans la documentation de Xcode ou Google).

Vous ne voulez probablement pas enregistrer la pile de chaque appel de méthode. Le volume d'information deviendrait vite écrasant. Et cela ne devrait pas être un mystère pour savoir pourquoi la plupart des méthodes de votre application sont appelées (bien qu'il faudra un certain temps pour comprendre pourquoi l'interface entre UIKit et votre application fonctionne comme elle le fait).

4

Quelque chose comme cela pourrait être utile pour vous aussi bien


@implementation UIApplication (MyCategory) 

+ (void)logStackTrace { 
    @try { 
     [[NSException exceptionWithName:@"Stack Trace" reason:@"Testing" userInfo:nil] raise]; 
    } 
    @catch (NSException *e) { 
     NSLog(@"%@", [e callStackSymbols]); 
    } 
} 

@end 
+8

Ceci est utile avant iOS 4. Utilisez [NSThread callStackSymbols] pour iOS 4+. –

Questions connexes