8
votes

Façon facile d'imprimer la trace de pile actuelle d'une application?

Xcode / objectif C n'imprime pas vraiment une trace utile de la pile. Mon application se bloque quelque part et la fichue chose ne me donne que des chiffres comme 45353453, 34524323, 6745345353, 457634524234. Pas utile du tout.

donc je veux faire un nslog (); Au début de chaque méthode, j'ai dans toute mon application. Mais peut-être qu'il y a un moyen plus simple de découvrir la vraie trace de la pile, lisible humainement? Non seulement sur l'application lancement ou crash, mais tout le temps, sur chaque activité qui se produit? Aiderait à déboguer beaucoup.


3 commentaires

Vous pouvez suivre la trace de la pile dans le débogueur, il devrait vous amener à la dernière méthode appeler devant l'accident que je pense


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


Pourquoi les informations de débogueur ne sont-elles pas utiles? Si vous démarrez votre application dans le débogueur et que vous vous bloque, le débogueur doit présenter une bonne trace de pile que vous pouvez reculer pour voir chaque ligne appelée. Si votre demande est décalée à une exception, reportez-vous à la réponse de Alex_C pour savoir comment déboguer cela.


3 Réponses :


1
votes

Il n'y a vraiment pas de moyen de le faire de manière fiable de l'application. Si votre application se bloque et ne donne pas de symboles, cela ressemble à votre version de la version dénudée et non de la version de débogage?

Si vous avez la version séduisée assise, vous pouvez corréler entre ces chiffres et le nom réel du cadre de pile à l'aide de la commande atos (voir homme 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'informations deviendrait rapidement écrasant. Et cela ne devrait pas être un mystère de 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 ça).


0 commentaires

3
votes

Ajouter un point d'arrêt global pour objc_exception_throw, vous pouvez obtenir une trace de pile utile dans le débogueur.

Comment ajouter un point d'arrêt à objc_exception_throut?


0 commentaires

5
votes

Quelque chose comme ça pourrait vous être utile aussi

@implementation UIApplication (MyCategory)

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

@end


1 commentaires

Ceci est utile avant iOS 4. Utilisez [Nsthread CallStacksymbols] pour iOS 4+.