2008-10-20 114 views

回答

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

此代码适用于任何线程。

+13

Mac OS X 10.6中的新功能,当最初提出这个问题时,这并不存在。对于Snow-Leopard之前的版本,使用`backtrace`和`backtrace_symbols`函数;请参阅backtrace(3)联机帮助页。 – 2010-02-25 13:32:30

6

This几乎告诉你该怎么做。

基本上你需要设置的应用程序异常处理日志,是这样的:

#import <ExceptionHandling/NSExceptionHandler.h> 

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

不过请注意,这将只是一个注册的异常处理程序中工作(没有,例如,在@catch块) – 2008-10-23 00:13:59

9

Cocoa已经将未捕获异常的堆栈跟踪记录到控制台,虽然它们只是原始内存地址。如果您需要控制台中的符号信息,则可以使用Apple的sample code

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

+6

显然在iOS 4中可用,但不是3.2。下面是我用,从回溯手册页恬不知耻地复制: 的#include ... void *的调用堆栈[128]; int i,frames = backtrace(callstack,128); char ** strs = backtrace_symbols(callstack,frames); (i = 0; i mharper 2010-08-28 22:10:18

+0

在HandleException中被调用时,它会自行写回处理函数的跟踪,而[NSException callStackSymbols]会显示引发异常的地方的堆栈。但是,如果用“NSDataArray = [callStackReturnAddresses]; int frames = arr.count; for(i = 0; i Tertium 2012-09-28 19:38:17

33

N13的回答didnt相当的工作 - 我修改了它稍微想出这个

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