你如何打印出一个堆栈跟踪到控制台/日志cocoa?

我想logging呼叫跟踪在某些点,如失败的断言,或未捕获的exception。

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

此代码适用于任何线程。

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

Cocoa已经将未捕获exception的堆栈跟踪logging到控制台,尽pipe它们只是原始内存地址。 如果你想在控制台中使用符号信息,可以从苹果公司获得一些示例代码 。

如果你想在你的代码的任意一点产生堆栈跟踪(你在Leopard上),请参阅backtrace手册页。 在Leopard之前,你实际上必须挖掘调用堆栈本身。

这几乎告诉你该怎么做。

本质上,您需要设置应用程序exception处理来logging,如下所示:

 #import <ExceptionHandling/NSExceptionHandler.h> [[NSExceptionHandler defaultExceptionHandler] setExceptionHandlingMask: NSLogUncaughtExceptionMask | NSLogUncaughtSystemExceptionMask | NSLogUncaughtRuntimeErrorMask] 

对于exception,您可以使用exception的userInfo字典的NSStackTraceKey成员来执行此操作。 请参阅在苹果网站上控制程序对exception的回应 。