On November 15, the Fabric SDK and old versions of the Crashlytics SDK will stop sending crashes. To keep getting crash reports, make sure you upgrade to the latest version of the Firebase Crashlytics SDK (v17.0.0+ for Android, v4.0.0+ for iOS, or v6.15.0+ for Unity).
Trang này được dịch bởi Cloud Translation API.
Switch to English

Tùy chỉnh báo cáo sự cố Firebase Crashlytics của bạn

Firebase Crashlytics có thể hoạt động với rất ít thiết lập từ phía bạn. Ngay sau khi bạn thêm SDK, Crashlytics sẽ bắt đầu gửi báo cáo sự cố đến bảng điều khiển Firebase .

Để cung cấp cho bạn thông tin chi tiết hơn về báo cáo sự cố, Firebase Crashlytics cung cấp bốn cơ chế ghi nhật ký ngay lập tức: khóa tùy chỉnh , nhật ký tùy chỉnh , số nhận dạng người dùng và các trường hợp ngoại lệ bắt gặp .

Thêm khóa tùy chỉnh

Khóa tùy chỉnh giúp bạn có được trạng thái cụ thể của ứng dụng dẫn đến sự cố. Bạn có thể liên kết các cặp khóa / giá trị tùy ý với báo cáo sự cố của mình và xem chúng trong bảng điều khiển Firebase .

Bắt đầu với [CrashlyticsKit setObjectValue:forKey:] hoặc một trong các phương pháp liên quan:

- (void)setObjectValue:(id)value forKey:(NSString *)key;

// calls -description on value, perfect for NSStrings!
- (void)setIntValue:(int)value forKey:(NSString *)key;

- (void)setBoolValue:(BOOL)value forKey:(NSString *)key;

- (void)setFloatValue:(float)value forKey:(NSString *)key;

Đôi khi bạn cần thay đổi giá trị khóa hiện có. Gọi cùng một khóa, nhưng thay thế giá trị, ví dụ:

Objective-C
[CrashlyticsKit setIntValue:3 forKey:@"current_level"];
[CrashlyticsKit setObjectValue:@"logged_in" forKey:@"last_UI_action"];
Nhanh
Crashlytics.sharedInstance().setIntValue(42, forKey: "MeaningOfLife")
Crashlytics.sharedInstance().setObjectValue("Test value", forKey: "last_UI_action")

Thêm thông báo nhật ký tùy chỉnh

Để có thêm ngữ cảnh cho các sự kiện dẫn đến sự cố, bạn có thể thêm nhật ký Crashlytics tùy chỉnh vào ứng dụng của mình. Crashlytics liên kết các nhật ký với dữ liệu sự cố của bạn và hiển thị chúng trong bảng điều khiển Firebase .

Objective-C

Trong Objective-C, sử dụng CLS_LOG để giúp xác định các vấn đề. Nó tự động bao gồm thông tin về lớp Objective-C, phương thức và số dòng được liên kết với nhật ký.

Hành vi CLS_LOG thay đổi tùy thuộc vào việc nó đang ghi nhật ký để gỡ lỗi hay bản dựng phát hành:

  • Bản dựng gỡ lỗi: CLS_LOG chuyển tới NSLog để bạn có thể xem kết quả đầu ra trong Xcode và trên thiết bị hoặc trình mô phỏng.
  • Phiên bản phát hành: Để cải thiện hiệu suất, CLS_LOG tất cả các đầu ra khác và không chuyển qua NSLog .

Sử dụng CLS_LOG(format, ...) để đăng nhập với CLS_LOG . Ví dụ:

CLS_LOG(@"Higgs-Boson detected! Bailing out... %@", attributesDict);

Duyệt qua tệp tiêu đề Crashlytics/Crashlytics.h để biết thêm chi tiết về cách sử dụng CLS_LOG .

Nhanh

Trong Swift, sử dụng CLSLogv hoặc CLSNSLogv để giúp xác định các vấn đề.

Có hai điều cần lưu ý khi ghi nhật ký bằng CLSLogvCLSNSLogv :

  • Đối số định dạng của bạn phải là một chuỗi hằng số thời gian biên dịch. Điều này được thực thi bởi trình biên dịch trong Objective-C, nhưng khả năng bảo vệ đó hiện đã bị mất khi bắc cầu với Swift.
  • Lưu trữ các giá trị nhật ký trong một mảng và gọi getVaList trên mảng đó để truy xuất chúng.

Ví dụ:

func write(string: String) {
    CLSLogv("%@", getVaList([string]))
}
Nội suy chuỗi Swift sẽ không dẫn đến một chuỗi hằng thời gian biên dịch. Cũng giống như printf và NSLog, việc sử dụng một chuỗi không phải là hằng số với CLSLog có thể dẫn đến sự cố.

Nâng cao

Để kiểm soát nhiều hơn, bạn có thể tận dụng trực tiếp CLSLog(format, ...)CLSNSLog(format, ...) . Phần sau được chuyển tới NSLog để bạn có thể thấy kết quả đầu ra trong Xcode hoặc trên thiết bị hoặc trình mô phỏng. CLSLog(format, ...)CLSNSLog(format, ...) là chuỗi an toàn. CLSLog có nghĩa là ghi lại thông tin quan trọng để giải quyết các sự cố. Nó không nên được sử dụng để theo dõi các sự kiện trong ứng dụng.

Đặt số nhận dạng người dùng

Để chẩn đoán sự cố, thường hữu ích khi biết người dùng nào của bạn gặp phải sự cố nhất định. Crashlytics bao gồm một cách để xác định ẩn danh người dùng trong báo cáo sự cố của bạn.

Để thêm ID người dùng vào báo cáo của bạn, hãy chỉ định cho mỗi người dùng một số nhận dạng duy nhất dưới dạng số ID, mã thông báo hoặc giá trị băm:

Objective-C
[CrashlyticsKit setUserIdentifier:@"123456789"];
Nhanh
Crashlytics.sharedInstance().setUserIdentifier("123456789")

Nếu bạn cần xóa số nhận dạng người dùng sau khi đặt, hãy đặt lại giá trị thành chuỗi trống. Xóa số nhận dạng người dùng không xóa các bản ghi Crashlytics hiện có. Nếu bạn cần xóa các bản ghi được liên kết với ID người dùng, hãy liên hệ với bộ phận hỗ trợ của Firebase .

Ghi nhật ký các trường hợp ngoại lệ không gây tử vong

Ngoài việc tự động báo cáo sự cố ứng dụng của bạn, Crashlytics cho phép bạn ghi lại các trường hợp ngoại lệ không nghiêm trọng.

Trên iOS, bạn làm điều đó bằng cách ghi lại các đối tượng NSError , mà Crashlytics báo cáo và nhóm giống như sự cố:

Objective-C
[CrashlyticsKit recordError:error];
Nhanh
Crashlytics.sharedInstance().recordError(error)

Khi sử dụng phương thức recordError , điều quan trọng là phải hiểu cấu trúc NSError và cách Crashlytics sử dụng dữ liệu để nhóm các sự cố. Việc sử dụng không đúng phương thức recordError có thể gây ra hành vi không đáng tin cậy và có thể yêu cầu Crashlytics giới hạn báo cáo về các lỗi đã ghi cho ứng dụng của bạn.

Một đối tượng NSError có ba đối số: domain: String , code: IntuserInfo: [AnyHashable : Any]? = nil

Không giống như các sự cố nghiêm trọng, được nhóm thông qua phân tích theo dõi ngăn xếp, các lỗi đã ghi được nhóm theo domaincode NSError. Đây là sự khác biệt quan trọng giữa sự cố nghiêm trọng và lỗi đã ghi. Ví dụ, ghi lại một lỗi như:

NSDictionary *userInfo = @{
    NSLocalizedDescriptionKey: NSLocalizedString(@"The request failed.", nil),
    NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"The response returned a 404.", nil),
    NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Does this page exist?", nil),
    ProductID: @"123456";
    UserID: @"Jane Smith"
};

NSError *error = [NSError domain:NSSomeErrorDomain
                          code:-1001
                          userInfo:userInfo];

Tạo một vấn đề mới được nhóm bởi NSSomeErrorDomain-1001 . Các lỗi đã ghi bổ sung sử dụng cùng tên miền và giá trị mã sẽ được nhóm lại trong vấn đề này.

Tránh sử dụng các giá trị duy nhất, chẳng hạn như ID người dùng, ID sản phẩm và dấu thời gian trong miền và trường mã. Việc sử dụng các giá trị duy nhất trong các trường này gây ra nhiều vấn đề và có thể dẫn đến việc Crashlytics cần giới hạn báo cáo các lỗi đã ghi trong ứng dụng của bạn. Thay vào đó, các giá trị duy nhất phải được thêm vào đối tượng Từ điển userInfo.

Dữ liệu chứa trong đối tượng userInfo được chuyển đổi thành các cặp khóa-giá trị và được hiển thị trong phần khóa / nhật ký trong một vấn đề riêng lẻ.

Crashlytics chỉ lưu trữ 8 ngoại lệ gần đây nhất trong một phiên ứng dụng nhất định. Nếu ứng dụng của bạn ném nhiều hơn 8 ngoại lệ trong một phiên, các ngoại lệ cũ hơn sẽ bị mất.

Nhật ký và khóa tùy chỉnh

Cũng giống như báo cáo sự cố, bạn có thể nhúng nhật ký và khóa tùy chỉnh để thêm ngữ cảnh vào NSError. Tuy nhiên, có sự khác biệt về những bản ghi được đính kèm với sự cố so với lỗi đã ghi. Khi sự cố xảy ra và ứng dụng được khởi chạy lại, nhật ký mà Crashlytics truy xuất từ ​​đĩa là những nhật ký được ghi ngay đến thời điểm xảy ra sự cố. Khi bạn đăng nhập một NSError, ứng dụng sẽ không kết thúc ngay lập tức. Bởi vì Crashlytics chỉ gửi báo cáo lỗi đã ghi vào lần khởi chạy ứng dụng tiếp theo và bởi vì Crashlytics phải giới hạn dung lượng được phân bổ cho các nhật ký trên đĩa, nên có thể ghi lại đủ sau khi NSError được ghi lại để tất cả nhật ký liên quan được xoay vòng bởi thời gian Crashlytics gửi báo cáo từ thiết bị. Hãy ghi nhớ sự cân bằng này khi ghi nhật ký NSErrors và sử dụng CLSLog và các khóa tùy chỉnh trong ứng dụng của bạn.

Cân nhắc về hiệu suất

Hãy nhớ rằng việc ghi lại một NSError có thể khá tốn kém. Tại thời điểm bạn thực hiện cuộc gọi, Crashlytics nắm bắt ngăn xếp cuộc gọi của luồng hiện tại bằng cách sử dụng một quy trình được gọi là giải nén ngăn xếp. Quá trình này có thể chuyên sâu về CPU và I / O, đặc biệt là trên các kiến ​​trúc hỗ trợ giải nén DWARF (arm64 và x86). Sau khi hoàn tất việc thư giãn, thông tin được ghi vào đĩa một cách đồng bộ. Điều này ngăn chặn việc mất dữ liệu nếu dòng tiếp theo bị lỗi.

Mặc dù gọi API này trên một chuỗi nền là an toàn, nhưng hãy nhớ rằng việc gửi lệnh gọi này đến hàng đợi khác sẽ làm mất ngữ cảnh của dấu vết ngăn xếp hiện tại.

Điều gì về NSExceptions?

Crashlytics không cung cấp cơ sở để ghi / ghi trực tiếp các phiên bản NSException. Nói chung, các API Cocoa và Cocoa Touch không phải là ngoại lệ an toàn. Điều đó có nghĩa là việc sử dụng @catch có thể gây ra các tác dụng phụ ngoài ý muốn rất nghiêm trọng trong quá trình của bạn, ngay cả khi sử dụng cẩn thận. Bạn không bao giờ nên sử dụng câu lệnh @catch trong mã của mình. Vui lòng tham khảo tài liệu của Apple về chủ đề này.

Bật báo cáo chọn tham gia

Theo mặc định, Firebase Crashlytics tự động thu thập báo cáo sự cố cho tất cả người dùng ứng dụng của bạn. Để cung cấp cho người dùng nhiều quyền kiểm soát hơn đối với dữ liệu họ gửi, bạn có thể bật báo cáo chọn tham gia.

Để làm điều này, bạn phải tắt tính năng thu thập tự động và chỉ khởi chạy Crashlytics cho người dùng chọn tham gia.

  1. Tắt bộ sưu tập tự động bằng khóa mới cho tệp Info.plist của bạn:
    • Khóa: firebase_crashlytics_collection_enabled
    • Giá trị: false
  2. Bật bộ sưu tập cho những người dùng đã chọn bằng cách khởi chạy Crashlytics trong thời gian chạy:
    Objective-C
    [Fabric with:@[[Crashlytics class]]];
    Nhanh
    Fabric.with([Crashlytics.self])

Quản lý dữ liệu Crash Insights

Crash Insights giúp bạn giải quyết các vấn đề bằng cách so sánh các dấu vết ngăn xếp ẩn danh của bạn với các dấu vết từ các ứng dụng Firebase khác và cho bạn biết liệu sự cố của bạn có phải là một phần của xu hướng lớn hơn hay không. Đối với nhiều vấn đề, Crash Insights thậm chí còn cung cấp tài nguyên để giúp bạn gỡ lỗi.

Crash Insights sử dụng dữ liệu sự cố tổng hợp để xác định các xu hướng ổn định phổ biến. Nếu không muốn chia sẻ dữ liệu ứng dụng của mình, bạn có thể chọn không tham gia Crash Insights từ menu Crash Insights ở đầu danh sách sự cố Crashlytics trong bảng điều khiển Firebase .