284

Tôi muốn ghi nhật ký theo dõi cuộc gọi trong một số điểm nhất định, như xác nhận thất bại hoặc ngoại lệ chưa được phát hiện.

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

Mã này hoạt động trên bất kỳ chủ đề.

|
34

Câu trả lời của n13 không thực sự hiệu quả - Tôi đã sửa đổi nó một chút để đưa ra điều 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;
    }
}
|
  • 1

    Gah ... Apple nên biến điều này thành một tiêu chuẩn ít nhất là 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

    – Dinh Hung 20:02:24 11/09/2013
  • 1

    Tôi đặt những 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.

    – Hoàng Hồng Linh 08:18:24 11/04/2014
  • 1

    Điều này không hoạt động trong mọi tình huống. Đây là một cách tiếp cận tốt hơn nếu bạn muốn nắm bắt tất cả các ngoại lệ chưa được phát hiện: codereview.stackexchange.com/questions/56162/ mẹo (Mã trong câu hỏi đó hơi phức tạp một chút, nhưng nó cũng không chỉ đơn giản là ghi nhật ký các biểu tượng ngăn xếp cuộc gọi.)

    – Đỗ Duy Ngôn 21:57:07 12/07/2014
  • 1

    Bạn có thể thêm NSLog(@"[Error] - %@ %@", exception.name, exception.reason);nếu bạn cũng muốn ngoại lệ thực tế

    – Hoàng Khắc Duy 15:02:09 25/03/2015
9

Ca cao đã ghi lại dấu vết ngăn xếp trên các ngoại lệ chưa được lưu vào 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 tượng trưng trong bảng điều khiển, có một số mã mẫu từ Apple.

Nếu bạn muốn tạo theo dõi ngăn xếp tại một điểm tùy ý trong mã của bạn (và bạn đang ở trên Leopard), hãy xem trang man backtrace. Trước Leopard, bạn thực sự phải tự đào bới ngăn xếp cuộc gọi.

|
  • 1

    Rõ ràng có sẵn trong iOS 4 nhưng không phải 3.2. Đây là những gì tôi đã sử dụng, được sao chép một cách đáng xấu hổ từ trang man backtrace: #include <execinfo.h> ... void * callstack [128]; int i, frames = backtrace (callstack, 128); char ** strs = backtrace_symbols (callstack, frames); for (i = 0; i <frames; ++ i) {printf ("% s \ n", strs [i]); } miễn phí (strs);

    – Dinh Hung 22:10:18 28/08/2010
  • 1

    Được gọi trong HandleException, nó ghi lại dấu vết của hàm xử lý, trong khi [NSException callStackSymbols] hiển thị ngăn xếp của nơi mà ngoại lệ đã đưa ra. Nhưng nếu bạn thay thế "backtrace (...)" bằng: "NSArray Array = [ex callStackReturnAddresses]; int frames = Array.count; for (i = 0; i <frames; ++ i) callstack [i] = ( void) [((NSNumber *) [Array objectAt Index: i]) intValue]; " bạn sẽ nhận được dấu vết ngăn xếp ngoại lệ hiện tại. Đây là cách [NSException callStackSymbols] hoạt động, tôi cho rằng: dấu vết họ trả lại bằng nhau và trong cả hai cuộc gọi ứng dụng được thay thế bằng _mh_execute_header khi phát hành.

    – Hoàng Hồng Linh 19:38:17 28/09/2012
6

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

Về cơ bản, bạn cần thiết lập xử lý ngoại lệ ứng dụng để ghi nhật ký, đại loại như:

#import <ExceptionHandling/NSExceptionHandler.h>

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

    Lưu ý, mặc dù điều này sẽ chỉ hoạt động trong một trình xử lý ngoại lệ đã đăng ký (không, ví dụ: trong khối @catch)

    – Dinh Hung 00:13:59 23/10/2008
2

Đối với các trường hợp ngoại lệ, bạn có thể sử dụng thành viên NSStackTraceKey của từ điển userInfo của ngoại lệ để thực hiện việc này. Xem Kiểm soát phản hồi của chương trình đối với các ngoại lệ trên trang web của Apple.

|
1

In nhanh chóng theo cách này:

print("stack trace:\(Thread.callStackSymbols)")
|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.