Tôi muốn ghi lại dấu vết 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.
Tôi muốn ghi lại dấu vết 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.
Câu trả lời:
NSLog(@"%@",[NSThread callStackSymbols]);
Mã này hoạt động trên bất kỳ chủ đề.
backtrace/backtrace_symbols
trực tiếp
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;
}
}
NSLog(@"[Error] - %@ %@", exception.name, exception.reason);
nếu bạn cũng muốn ngoại lệ thực tế
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 qua ngăn xếp cuộc gọi.
Đ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]
Đố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.
backtrace
và cácbacktrace_symbols
chức năng; xem trang chủ backtrace (3).