J'aimerais enregistrer la trace des appels à certains moments, comme les assertions ayant échoué ou les exceptions non capturées.
J'aimerais enregistrer la trace des appels à certains moments, comme les assertions ayant échoué ou les exceptions non capturées.
Réponses:
NSLog(@"%@",[NSThread callStackSymbols]);
Ce code fonctionne sur n'importe quel thread.
backtrace/backtrace_symbols
directement
la réponse de n13 n'a pas tout à fait fonctionné - je l'ai légèrement modifiée pour arriver à cette
#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;
}
}
NSLog(@"[Error] - %@ %@", exception.name, exception.reason);
si vous voulez aussi l'exception réelle
Cocoa enregistre déjà la trace de la pile sur les exceptions non capturées de la console, bien qu'il ne s'agisse que d'adresses de mémoire brute. Si vous voulez des informations symboliques dans la console, il y a un 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), consultez la page de manuel de backtrace. Avant Leopard, vous deviez réellement fouiller dans la pile d'appels elle-même.
Cela vous dit à peu près quoi faire.
Essentiellement, vous devez configurer la gestion des exceptions des applications pour vous connecter, quelque chose comme:
#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.
backtrace
etbacktrace_symbols
; voir la page de manuel backtrace (3).