Je voudrais enregistrer la trace d'appel pendant certains points, comme des assertions échouées ou des exceptions non interceptées.Comment imprimer une trace de pile sur la console/connectez-vous à Cocoa?
Répondre
NSLog(@"%@",[NSThread callStackSymbols]);
Ce code fonctionne sur n'importe quel thread.
This à peu près vous dit quoi faire.
Essentiellement, vous devez configurer les applications de gestion des exceptions pour ouvrir une session, quelque chose comme:
#import <ExceptionHandling/NSExceptionHandler.h>
[[NSExceptionHandler defaultExceptionHandler]
setExceptionHandlingMask: NSLogUncaughtExceptionMask |
NSLogUncaughtSystemExceptionMask |
NSLogUncaughtRuntimeErrorMask]
Notez bien que cela ne fonctionne que dans un gestionnaire d'exception enregistrée (non, par exemple, dans un bloc de @catch) –
Pour les exceptions, vous pouvez utiliser le membre NSStackTraceKey du userInfo dictionnaire de l'exception pour ce faire. Voir Controlling a Program's Response to Exceptions sur le site Web d'Apple.
Cocoa enregistre déjà la trace de la pile sur les exceptions non interceptées de la console, bien qu'il ne s'agisse que d'adresses mémoire brutes. Si vous voulez des informations symboliques dans la console, il y a quelques sample code d'Apple.
Si vous souhaitez générer une trace de pile à un point arbitraire de votre code (et que vous êtes sur Leopard), reportez-vous à la page de manuel backtrace. Avant Leopard, vous deviez creuser la pile d'appels elle-même.
Apparemment disponible dans iOS 4 mais pas 3.2. Voici ce que je, sans vergogne copié à partir de la page de manuel Backtrace: #include
Appelé dans HandleException, il écrit lui-même la trace de la fonction de gestionnaire, tandis que [NSException callStackSymbols] affiche la pile de l'emplacement où l'exception a été levée. Mais si vous remplacez "backtrace (...)" par: "NSArray arr = [ex callStackReturnAddresses]; int frames = arr.count; pour (i = 0; i
travail na pas de réponse de n13 tout à fait - je l'ai modifié légèrement pour arriver à ce
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char *argv[])
{
@autoreleasepool {
int retval;
@try{
retval = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
@catch (NSException *exception)
{
NSLog(@"Gosh!!! %@", [exception callStackSymbols]);
@throw;
}
return retval;
}
}
Bonne approche! Je cherchais depuis longtemps ce type de code. – NightFury
Gah ... Apple devrait en faire un standard au moins lors du développement d'une application. Un tas d'adresses de mémoire est ... archaïque – Russ
J'ai mis vos améliorations dans ma réponse; Je l'ai fait avant ARC. Merci. – n13
- 1. Comment obtenir une trace de la pile de FastMM
- 2. Afficher la trace de la pile DNN?
- 3. Comment forcer ruby à afficher une trace de pile complète?
- 4. zend trace de la pile du framework
- 5. Comment puis-je obtenir la trace de pile dans Specman?
- 6. Informations sur la trace de la pile d'impression à partir du C#
- 7. Implémentation d'une trace de pile sous Windows
- 8. Comment puis-je capturer une trace de pile sur les ordinateurs QA?
- 9. Comment augmenter le nombre de lignes affichées d'un vidage de trace de la pile Java?
- 10. Besoin d'aide pour déchiffrer une trace de pile C#
- 11. Obtention d'informations de code source à partir de la trace de la pile groovy
- 12. Comment interpréter cette trace de pile C#? Erreur sur la ligne zéro
- 13. Comment faire pour obtenir une trace de pile à partir du fichier de vidage sous Windows
- 14. meilleure compréhension d'une pile OC4J Trace
- 15. débogage de la page ASPX qui donne une petite trace de la pile?
- 16. Obtention de la trace de la pile actuelle sous Mac OS X
- 17. Développement iPhone - Erreur EXC_BAD_ACCESS sans trace de pile
- 18. Existe-t-il un moyen d'imprimer une trace de pile à l'écran dans Java ME?
- 19. Comment décrire une fonction locale à (trace)?
- 20. mettre l'application sur la trace
- 21. Comment obtenir une trace de pile lorsque le programme C++ se bloque? (en utilisant msvc8/2005)
- 22. Comment convertir au mieux une trace de pile en HTML (en utilisant .NET - C#)
- 23. Un moyen facile d'imprimer la trace de la pile actuelle d'une application?
- 24. Erreur générique GDI + avec ThreadExceptionDialog dans la trace de la pile
- 25. Que signifient les valeurs "+ n" à la fin d'un nom de méthode dans une trace de pile?
- 26. Comment obtenir la pile de pile dans un appareil mobile?
- 27. Comment puis-je relancer une Exception interne tout en conservant la trace de pile générée jusqu'à présent?
- 28. obtenir des informations de trace de pile dans une erreur tomcat personnalisée 500 page
- 29. retourner la valeur dans une pile - C++
- 30. Obtention d'une trace de pile de chaînes complète, y compris une exception interne
Nouveauté de Mac OS X 10.6, qui n'existait pas lorsque cette question avait été initialement posée. Pour pré-Snow-Leopard, utilisez les fonctions 'backtrace' et' backtrace_symbols'; voir la page de manuel backtrace (3). –
Fonctionne également sur iOS. –
Seulement sur iOS 4.0 et au-dessus. – Danra