2009-09-03 36 views
8

Xcode/mục tiêu c không thực sự in một dấu vết ngăn xếp hữu ích. Ứng dụng của tôi bị treo ở đâu đó và thứ chết tiệt chỉ mang lại cho tôi những con số như 45353453, 34524323, 6745345353, 457634524234. Không hữu ích chút nào.Cách dễ dàng để in dấu vết ngăn xếp hiện tại của một ứng dụng?

Vì vậy, tôi muốn tạo NSLog(); vào đầu MỌI phương pháp tôi có trong toàn bộ ứng dụng của mình. Nhưng có lẽ có một cách đơn giản hơn để tìm ra dấu vết ngăn xếp thực sự, có thể đọc được bằng con người? Không chỉ trên khởi chạy ứng dụng hoặc gặp sự cố, nhưng tất cả thời gian, trên mọi hoạt động xảy ra? Sẽ giúp gỡ lỗi rất nhiều.

+0

bạn có thể làm theo các vết đống trong trình gỡ lỗi, nó sẽ đưa bạn đến các cuộc gọi phương thức cuối cùng trước khi vụ tai nạn tôi nghĩ rằng – Daniel

+0

Không, thông tin trình gỡ lỗi không thực sự hữu ích. –

+1

Tại sao thông tin trình gỡ lỗi không hữu ích? Nếu bạn khởi động ứng dụng của mình trong trình gỡ lỗi và trình gỡ lỗi, trình gỡ lỗi sẽ hiển thị dấu vết ngăn xếp tốt đẹp mà bạn có thể quay lại để xem từng dòng được gọi. Nếu ứng dụng của bạn đang tạm dừng ngoại lệ, hãy xem câu trả lời của alex_c về cách gỡ lỗi đó. –

Trả lời

1

Thực sự không phải là cách để thực hiện điều này một cách đáng tin cậy từ bên trong ứng dụng. Nếu ứng dụng của bạn bị lỗi và không đưa ra biểu tượng, có vẻ như bạn đang chạy phiên bản phát hành bị tước bỏ và không phải là phiên bản gỡ lỗi?

Nếu bạn có phiên bản unstripped ngồi xung quanh, bạn có thể tương quan giữa những con số và tên thực tế của stack frame bằng cách sử dụng lệnh atos (xem man atos trong Terminal hoặc tìm kiếm atos trong tài liệu hoặc Google Xcode của).

Có thể bạn không muốn ghi lại ngăn xếp của mọi cuộc gọi phương thức. Khối lượng thông tin sẽ nhanh chóng trở nên áp đảo. Và nó không phải là một bí ẩn là tại sao hầu hết các phương pháp trong ứng dụng của bạn đang được gọi (mặc dù nó sẽ mất một lúc để hiểu tại sao giao diện giữa UIKit và ứng dụng của bạn hoạt động theo cách của nó).

4

Something như thế này có thể hữu ích đối với bạn cũng


@implementation UIApplication (MyCategory) 

+ (void)logStackTrace { 
    @try { 
     [[NSException exceptionWithName:@"Stack Trace" reason:@"Testing" userInfo:nil] raise]; 
    } 
    @catch (NSException *e) { 
     NSLog(@"%@", [e callStackSymbols]); 
    } 
} 

@end 
+8

Tính năng này hữu ích trước khi sử dụng iOS 4. Sử dụng [NSThread callStackSymbols] cho iOS 4+. –

Các vấn đề liên quan