J'aimerais enregistrer la trace des appels à certains moments, comme des assertions échouées ou des exceptions non capturées.
NSLog(@"%@",[NSThread callStackSymbols]);
Ce code fonctionne sur n'importe quel thread.
la réponse de n13 n'a pas tout à fait fonctionné - je l'ai légèrement modifiée
#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;
}
}
Cocoa enregistre déjà la trace de pile dans la console avec des exceptions non interceptées, bien qu'il ne s'agisse que d'adresses de mémoire brutes. Si vous voulez des informations symboliques dans la console, utilisez exemple de 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 relative à la trace. Avant Leopard, vous deviez creuser la pile d’appel elle-même.
Ceci vous dit à peu près quoi faire.
Pour résumer, vous devez configurer la gestion des exceptions des applications, comme suit:
#import <ExceptionHandling/NSExceptionHandler.h>
[[NSExceptionHandler defaultExceptionHandler]
setExceptionHandlingMask: NSLogUncaughtExceptionMask |
NSLogUncaughtSystemExceptionMask |
NSLogUncaughtRuntimeErrorMask]
Pour les exceptions, vous pouvez utiliser le membre NSStackTraceKey du dictionnaire userInfo de l'exception pour ce faire. Voir Contrôle de la réponse d'un programme aux exceptions sur le site Web d'Apple.
Dans Swift, imprimez de cette façon:
print("stack trace:\(Thread.callStackSymbols)")