你如何打印出一个堆栈跟踪到控制台/日志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的回应 。