提问



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

最佳参考


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


此代码适用于任何线程。

其它参考1


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

其它参考2


Cocoa已经将未捕获的异常的堆栈跟踪记录到控制台,尽管它们只是原始内存地址。如果你想在控制台中获得符号信息,那么Apple会提供一些示例代码。[4]


如果你想在代码中的任意一点生成堆栈跟踪(并且你在Leopard上),请参阅backtrace手册页。在Leopard之前,你实际上必须深入了解调用堆栈本身。

其它参考3


这几乎告诉你该怎么做。[5]


基本上,您需要设置应用程序异常处理以进行记录,例如:


#import <ExceptionHandling/NSExceptionHandler.h>

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

其它参考4


对于异常,您可以使用异常userInfo字典的NSStackTraceKey成员执行此操作。请参阅Apple网站上的控制程序对异常的响应。[6]