web-dev-qa-db-fra.com

Comment pouvez-vous imprimer une trace de pile sur la console/log dans Cocoa?

J'aimerais enregistrer la trace des appels à certains moments, comme des assertions échouées ou des exceptions non capturées.

284
robottobor
 NSLog(@"%@",[NSThread callStackSymbols]);

Ce code fonctionne sur n'importe quel thread.

523
smokris

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;
    }
}
34
Zayin Krige

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.

9
vt.

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]
6
Max Stewart

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.

2
Ben Gottlieb

Dans Swift, imprimez de cette façon:

print("stack trace:\(Thread.callStackSymbols)")
1
Deepak