2008-10-20 10 views

Trả lời

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

Mã này hoạt động trên bất kỳ chuỗi nào.

+13

Mới trong Mac OS X 10.6, không tồn tại khi câu hỏi này ban đầu được hỏi. Đối với Snow-Leopard trước, sử dụng các hàm 'backtrace' và' backtrace_symbols'; xem man page backtrace (3). –

+3

Hoạt động trên iOS. –

+5

Chỉ trên iOS 4.0 trở lên. – Danra

6

This khá nhiều sẽ cho bạn biết phải làm gì.

Về cơ bản bạn cần phải thiết lập các ứng dụng xử lý để đăng nhập ngoại lệ, một cái gì đó như:

#import <ExceptionHandling/NSExceptionHandler.h> 

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

Lưu ý, dù rằng điều này sẽ chỉ làm việc trong vòng một handler ngoại lệ đã đăng ký (không, ví dụ như, trong một khối @catch) –

2

Đối với trường hợp ngoại lệ, bạn có thể sử dụng các thành viên NSStackTraceKey của từ điển UserInfo của ngoại lệ để làm điều này. Xem Controlling a Program's Response to Exceptions trên trang web của Apple.

9

Ca cao đã ghi nhật ký ngăn xếp trên các trường hợp ngoại lệ chưa được xử lý cho bảng điều khiển mặc dù chúng chỉ là địa chỉ bộ nhớ thô. Nếu bạn muốn thông tin biểu tượng trong bảng điều khiển có một số sample code từ Apple.

Nếu bạn muốn tạo dấu vết ngăn xếp tại một điểm tùy ý trong mã của bạn (và bạn đang sử dụng Leopard), hãy xem trang hướng dẫn ngược. Trước khi Leopard, bạn thực sự đã phải tìm hiểu kỹ về ngăn xếp cuộc gọi.

+6

Rõ ràng có sẵn trong iOS 4 nhưng không phải là 3.2. Đây là những gì tôi đã sử dụng, không biết xấu hổ sao chép từ trang backtrace người đàn ông: #include ... void * callstack [128]; int i, frames = backtrace (callstack, 128); char ** strs = backtrace_symbols (callstack, frames); cho (i = 0; i mharper

+0

Được gọi trong HandleException nó ghi lại dấu vết của hàm điều khiển chính nó, trong khi [NSException callStackSymbols] hiển thị chồng của vị trí mà ngoại lệ đã nâng lên. Nhưng nếu bạn thay thế "backtrace (...)" bằng: "NSArray arr = [ex callStackReturnAddresses]; int frames = arr.count; cho (i = 0; i Tertium

33

câu trả lời didnt khá công việc N13 của - tôi sửa đổi nó một chút để đưa ra này

#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

Cách tiếp cận tốt! Tôi đã từ lâu tìm kiếm loại mã này. – NightFury

+1

Gah ... Apple nên làm cho tiêu chuẩn này ít nhất trong khi phát triển một ứng dụng. Một loạt các địa chỉ bộ nhớ là ... cổ xưa – Russ

+0

Tôi đặt các cải tiến của bạn trong câu trả lời của tôi; Tôi đã làm điều này trước ARC. Cảm ơn. – n13