it-swarm.com.de

Wie kann ich eine Stack-Trace auf die Konsole/Protokoll in Cocoa drucken?

Ich möchte die Anrufverfolgung an bestimmten Punkten protokollieren, z. B. fehlgeschlagene Zusicherungen oder nicht erfasste Ausnahmen.

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

Dieser Code funktioniert in jedem Thread.

523
smokris

die Antwort von n13 hat nicht ganz funktioniert

#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 protokolliert bereits die Stack-Ablaufverfolgung für nicht erfasste Ausnahmen in der Konsole, obwohl es sich nur um reine Speicheradressen handelt. Wenn Sie symbolische Informationen in der Konsole wünschen, gibt es einen Beispielcode von Apple.

Wenn Sie an einem beliebigen Punkt in Ihrem Code eine Stack-Ablaufverfolgung erstellen möchten (und Sie Leopard verwenden), lesen Sie die Manpage backtrace. Vor Leopard mussten Sie tatsächlich den Aufrufstapel selbst durchsuchen.

9
vt.

Das sagt dir ziemlich genau was zu tun ist.

Im Wesentlichen müssen Sie die Anwendungsausnahmebehandlung für die Protokollierung einrichten, etwa: 

#import <ExceptionHandling/NSExceptionHandler.h>

[[NSExceptionHandler defaultExceptionHandler] 
                  setExceptionHandlingMask: NSLogUncaughtExceptionMask | 
                                            NSLogUncaughtSystemExceptionMask | 
                                            NSLogUncaughtRuntimeErrorMask]
6
Max Stewart

Für Ausnahmen können Sie dazu das Member NSStackTraceKey des userInfo-Wörterbuchs der Exception verwenden. Siehe Steuern der Reaktion eines Programms auf Ausnahmen auf der Apple-Website.

2
Ben Gottlieb

In Swift so drucken:

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