Как распечатать трассировку стека на консоль/журнал в Cocoa?

Я хотел бы зарегистрировать трассировку вызова в определенные моменты, например, неудачные утверждения или неотображаемые исключения.

Ответ 1

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

Этот код работает в любом потоке.

Ответ 2

n13 ответ не работал - я немного изменил его, чтобы придумать этот

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

Ответ 3

Cocoa уже регистрирует трассировку стека на неперехваченных исключениях на консоли, хотя они являются просто необработанными адресами памяти. Если вам нужна символическая информация на консоли, пример кода от Apple.

Если вы хотите создать трассировку стека в произвольной точке вашего кода (и вы находитесь на Leopard), см. справочную страницу backtrace. До Leopard вам действительно приходилось прорываться через стек вызовов.

Ответ 4

Это в значительной степени говорит вам, что делать.

По существу вам нужно настроить обработку исключений приложений для журнала, например:

#import <ExceptionHandling/NSExceptionHandler.h>

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