如何将堆栈跟踪打印到Cocoa中的控制台/日志?

时间:2008-10-20 22:24:21

标签: objective-c cocoa

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

6 个答案:

答案 0 :(得分:531)

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

此代码适用于任何线程。

答案 1 :(得分:34)

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 :(得分:9)

Cocoa已经将未捕获的异常的堆栈跟踪记录到控制台,尽管它们只是原始内存地址。如果您想在控制台中使用符号信息,那么Apple会有一些sample code

如果要在代码中的任意点生成堆栈跟踪(并且您在Leopard上),请参阅backtrace手册页。在Leopard之前,你实际上不得不深入挖掘调用堆栈本身。

答案 3 :(得分:6)

This几乎告诉你该怎么做。

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

#import <ExceptionHandling/NSExceptionHandler.h>

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

答案 4 :(得分:2)

对于异常,您可以使用异常的userInfo字典的NSStackTraceKey成员来执行此操作。请参阅Apple网站上的Controlling a Program's Response to Exceptions

答案 5 :(得分:1)

以这种方式快速打印:

Foo