Как вы распечатываете трассировку стека в консоли / журнале в Какао? - PullRequest
286 голосов
/ 21 октября 2008

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

Ответы [ 6 ]

532 голосов
/ 24 февраля 2010
 NSLog(@"%@",[NSThread callStackSymbols]);

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

34 голосов
/ 09 января 2013

ответ 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;
    }
}
9 голосов
/ 21 октября 2008

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

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

6 голосов
/ 21 октября 2008

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

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

#import <ExceptionHandling/NSExceptionHandler.h>

[[NSExceptionHandler defaultExceptionHandler] 
                  setExceptionHandlingMask: NSLogUncaughtExceptionMask | 
                                            NSLogUncaughtSystemExceptionMask | 
                                            NSLogUncaughtRuntimeErrorMask]
2 голосов
/ 21 октября 2008

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

1 голос
/ 12 ноября 2018

Быстрая печать следующим образом:

print("stack trace:\(Thread.callStackSymbols)")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...