it-swarm.com.ru

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

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

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

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

523
smokris

ответ 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;
    }
}
34
Zayin Krige

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

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

9
vt.

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

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

#import <ExceptionHandling/NSExceptionHandler.h>

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

Для исключений вы можете использовать для этого член NSStackTraceKey из словаря userInfo исключения. См. Управление реакцией программы на исключения на веб-сайте Apple.

2
Ben Gottlieb

В Swift распечатайте так:

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