robottobor
robottobor

Reputation: 11772

How do you print out a stack trace to the console/log in Cocoa?

I'd like to log the call trace during certain points, like failed assertions, or uncaught exceptions.

Upvotes: 306

Views: 98168

Answers (7)

miragessee
miragessee

Reputation: 339

If you want to get it as NSString.

[NSThread  callStackSymbols].description

Upvotes: -2

smokris
smokris

Reputation: 11850

This code works on any thread:

NSLog(@"%@", NSThread.callStackSymbols);

Returns an array containing the call stack symbols. Each element is an NSString object with a value in a format determined by the backtrace_symbols() function.

Upvotes: 566

Zayin Krige
Zayin Krige

Reputation: 3308

n13's answer didn't quite work - I modified it slightly to come up with this

#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;
    }
}

Upvotes: 35

vt.
vt.

Reputation: 1071

Cocoa already logs the stack trace on uncaught exceptions to the console although they're just raw memory addresses. If you want symbolic information in the console there's some sample code from Apple.

If you want to generate a stack trace at an arbitrary point in your code (and you're on Leopard), see the backtrace man page. Before Leopard, you actually had to dig through the call stack itself.

Upvotes: 9

Max Stewart
Max Stewart

Reputation: 3583

This pretty much tells you what to do.

Essentially you need to set up the applications exception handling to log, something like:

#import <ExceptionHandling/NSExceptionHandler.h>

[[NSExceptionHandler defaultExceptionHandler] 
                  setExceptionHandlingMask: NSLogUncaughtExceptionMask | 
                                            NSLogUncaughtSystemExceptionMask | 
                                            NSLogUncaughtRuntimeErrorMask]

Upvotes: 6

Dipak
Dipak

Reputation: 2433

In swift print this way:

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

Upvotes: 2

Ben Gottlieb
Ben Gottlieb

Reputation: 85542

For exceptions, you can use the NSStackTraceKey member of the exception's userInfo dictionary to do this. See Controlling a Program's Response to Exceptions on Apple's website.

Upvotes: 2

Related Questions