我想在某些点记录调用跟踪,比如失败的断言或未捕获的异常。


当前回答

对于异常,你可以使用异常userInfo字典的NSStackTraceKey成员来做这件事。请参阅Apple网站上控制程序对异常的响应。

其他回答

这基本上告诉你该怎么做。

本质上,你需要设置应用程序异常处理日志,类似于:

#import <ExceptionHandling/NSExceptionHandler.h>

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

对于异常,你可以使用异常userInfo字典的NSStackTraceKey成员来做这件事。请参阅Apple网站上控制程序对异常的响应。

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

如果你想把它作为NSString。

[NSThread  callStackSymbols].description

这段代码适用于任何线程:

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

返回包含调用堆栈符号的数组。每个元素都是一个NSString对象,其值的格式由backtrace_symbols()函数决定。