2008-10-20 162 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; 
    } 
}