Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.
Trang này được dịch bởi Cloud Translation API.
Switch to English

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

Hướng dẫn này mô tả cách tùy chỉnh các báo cáo sự cố của bạn bằng SDK Firebase Crashlytics. Theo mặc định, Crashlytics tự động thu thập các báo cáo sự cố cho tất cả người dùng ứng dụng của bạn (thay vào đó bạn có thể tắt báo cáo sự cố tự động và bật báo cáo chọn tham gia cho người dùng của mình). Crashlytics cung cấp bốn cơ chế ghi nhật ký : khóa tùy chỉnh , nhật ký tùy chỉnh , số nhận dạng người dùngngoại lệ bị bắt .

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

Các phím 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 các báo cáo sự cố của mình và xem chúng trong bảng điều khiển Firebase .

Sử dụng phương thức setCustomValue để đặt các cặp khóa / giá trị. Ví dụ:

Nhanh

// Set int_key to 100.
Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key")

// Set str_key to "hello".
Crashlytics.crashlytics().setCustomValue("hello", forKey: "str_key")

Mục tiêu-C

Khi đặt số nguyên, booleans hoặc float, hãy đặt giá trị là @( value ) .

// Set int_key to 100.
[[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"];

// Set str_key to "hello".
[[FIRCrashlytics crashlytics] setCustomValue:@"hello" forKey:@"str_key"];

Bạn cũng có thể sửa đổi giá trị của một khóa hiện có bằng cách gọi khóa đó và đặt nó thành một giá trị khác. Ví dụ:

Nhanh

Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key")

// Set int_key to 50 from 100.
Crashlytics.crashlytics().setCustomValue(50, forKey: "int_key")

Mục tiêu-C

[[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"];

// Set int_key to 50 from 100.
[[FIRCrashlytics crashlytics] setCustomValue:@(50) forKey:@"int_key"];

Thêm thông điệp tường trình tùy chỉnh

Để cung cấp cho mình nhiều bối cảnh hơn 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 nhật ký với dữ liệu sự cố của bạn và hiển thị chúng trong trang Crashlytics của bảng điều khiển Firebase , trong tab Nhật ký .

Nhanh

Sử dụng log() hoặc log(format:, arguments:) để giúp xác định các vấn đề. Nếu bạn muốn nhận được một đầu ra nhật ký hữu ích với các thông báo, đối tượng mà bạn chuyển đến log() phải tuân theo thuộc tính CustomStringConvertible . log() trả về thuộc tính mô tả mà bạn xác định cho đối tượng. Ví dụ:

Crashlytics.crashlytics().log("Higgs-Boson detected! Bailing out…, \( attributesDict )")

.log(format:, arguments:) định dạng các giá trị được trả về từ khi gọi getVaList() . Ví dụ:

Crashlytics.crashlytics().log(format: "%@, %@", arguments: getVaList(["Higgs-Boson detected! Bailing out…", attributesDict ]))

Để biết thêm chi tiết về cách sử dụng log() hoặc log(format:, arguments:) , hãy tham khảo tài liệu tham khảo các hàm Crashlytics.

Mục tiêu-C

Sử dụng log hoặc logWithFormat để giúp xác định các vấn đề. Lưu ý rằng nếu bạn muốn nhận được một đầu ra nhật ký hữu ích với các thông báo, đối tượng mà bạn truyền cho một trong hai phương thức phải ghi đè lên thuộc description . Ví dụ:

[[FIRCrashlytics crashlytics] log:@"Simple string message"];

[[FIRCrashlytics crashlytics] logWithFormat:@"Higgs-Boson detected! Bailing out... %@", attributesDict ];

[[FIRCrashlytics crashlytics] logWithFormat:@"Logging a variable argument list %@" arguments: va_list_arg ];

Để biết thêm chi tiết về cách sử dụng loglogWithFormat , hãy tham khảo tài liệu tham khảo các hàm Crashlytics.

Đặt định danh 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 sự cố. Crashlytics bao gồm một cách để xác định người dùng ẩn danh trong các 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, chỉ định cho mỗi người dùng một mã định danh duy nhất dưới dạng số ID, mã thông báo hoặc giá trị băm:

Nhanh
Crashlytics.crashlytics().setUserID("123456789")
Mục tiêu-C
[[FIRCrashlytics crashlytics] setUserID:@"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 một định danh 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 liên quan đến ID người dùng, hãy liên hệ với bộ phận hỗ trợ của Firebase .

Báo cáo 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ố của ứng dụng, Crashlytics cho phép bạn ghi lại các trường hợp ngoại lệ không nghiêm trọng và gửi chúng cho bạn vào lần tiếp theo ứng dụng của bạn khởi chạy.

Bạn có thể ghi lại các trường hợp ngoại lệ không gây tử vong bằng cách ghi lại các đối tượng NSError bằng phương thức recordError . recordError ghi lại ngăn xếp cuộc gọi của luồng bằng cách gọi [NSThread callStackReturnAddresses] .

Nhanh

Crashlytics.crashlytics().record(error: error )

Mục tiêu-C

[[FIRCrashlytics crashlytics] 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 sự cố. Việc sử dụng sai phương thức recordError có thể gây ra hành vi không thể đoán trước và có thể khiến Crashlytics hạn chế báo cáo 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: Int
  • userInfo: [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 được ghi lại được nhóm theo domaincode . Đây là một sự phân biệt quan trọng giữa các sự cố nghiêm trọng và lỗi đăng nhập. Ví dụ:

Nhanh

let userInfo = [
  NSLocalizedDescriptionKey: NSLocalizedString("The request failed.", comment: ""),
  NSLocalizedFailureReasonErrorKey: NSLocalizedString("The response returned a 404.", comment: ""),
  NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString("Does this page exist?", comment: ""),
  "ProductID": "123456",
  "View": "MainView"
]

let error = NSError.init(domain: NSCocoaErrorDomain,
                         code: -1001,
                         userInfo: userInfo)

Mục tiêu-C

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",
  @"View": @"MainView",
};

NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
                                     code:-1001
                                 userInfo:userInfo];

Khi bạn ghi lại lỗi ở trên, nó sẽ tạo ra một vấn đề mới được nhóm bởi NSSomeErrorDomain-1001 . Các lỗi đăng nhập bổ sung sử dụng cùng một giá trị tên miền và mã được nhóm theo cùng một vấn đề. 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ẻ.

Cảnh báo: 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 các trường tên miền và 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ề tim mạch và có thể dẫn đến Crashlytics cần hạn chế 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 nên được thêm vào đối tượng từ điển userInfo .

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

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ó một sự khác biệt trong những gì nhật ký được gắn vào sự cố so với lỗi đã ghi. Khi xảy ra sự cố và ứng dụng được khởi chạy lại, nhật ký mà Crashlytics lấy từ đĩa là những bản ghi được viết đúng cho đến thời điểm xảy ra sự cố. Khi bạn đăng nhập NSError , ứng dụng sẽ không chấm dứt ngay lập tức. Vì Crashlytics chỉ gửi báo cáo lỗi đã ghi trong lần khởi chạy ứng dụng tiếp theo và phải giới hạn dung lượng được phân bổ cho các bản ghi trên đĩa, nên có thể đăng nhập đủ sau khi NSError được ghi lại để tất cả các nhật ký có liên quan được quay ra theo thời gian Crashlytics gửi báo cáo từ thiết bị. Giữ cân bằng này trong tâm trí khi đăng nhập NSErrors và sử dụng nhật ký và khóa tùy chỉnh trong ứng dụng của bạn.

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

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

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

NSExceptions thì sao?

Crashlytics không cung cấp phương tiện để ghi nhật ký và ghi trực tiếp các phiên bản NSException . Nói chung, API ca cao và ca cao cảm ứng 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ể có tác dụng phụ ngoài ý muốn rất nghiêm trọng trong quy trình của bạn, ngay cả khi được sử dụng hết sức cẩn thận. Bạn không bao giờ nên sử dụng các câu @catch trong mã của mình. Vui lòng tham khảo tài liệu của Apple về chủ đề này.

Tùy chỉnh dấu vết ngăn xếp

Nếu ứng dụng của bạn chạy trong môi trường không phải là nguồn gốc (như C ++ hoặc Unity), bạn có thể sử dụng API mô hình ngoại lệ để báo cáo siêu dữ liệu sự cố ở định dạng ngoại lệ gốc của ứng dụng. Các trường hợp ngoại lệ được báo cáo được đánh dấu là không gây tử vong.

Nhanh

 var  ex = ExceptionModel.init(name:"FooException", reason:"There was a foo.")
ex.stackTrace = [
  StackFrame.init(symbol:"makeError" fileName:"handler.js" lineNumber:495),
  StackFrame.init(symbol:"then" fileName:"routes.js" lineNumber:102),
  StackFrame.init(symbol:"main" fileName:"app.js" lineNumber:12),
]

crashlytics.record(exceptionModel:ex)
 

Mục tiêu-C

 FIRExceptionModel *model =
    [FIRExceptionModel exceptionModelWithName:@"FooException" reason:@"There was a foo."];
model.stackTrace = @[
  [FIRStackFrame stackFrameWithSymbol:@"makeError" fileName:@"handler.js" lineNumber:495],
  [FIRStackFrame stackFrameWithSymbol:@"then" fileName:@"routes.js" lineNumber:102],
  [FIRStackFrame stackFrameWithSymbol:@"main" fileName:@"app.js" lineNumber:12],
];
 

Cho phép báo cáo chọn tham gia

Theo mặc định, Crashlytics tự động thu thập các 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 quyền kiểm soát nhiều 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 cho người dùng của mình bằng cách vô hiệu hóa bộ sưu tập tự động và chỉ khởi tạo Crashlytics cho người dùng đã chọn:

  1. Tắt bộ sưu tập tự động bằng cách thêm khóa mới vào tệp Info.plist của bạn:

    • Khóa: FirebaseCrashlyticsCollectionEnabled
    • Giá trị: false
  2. Cho phép thu thập cho người dùng được chọn bằng cách gọi ghi đè bộ sưu tập dữ liệu Crashlytics khi chạy. Giá trị ghi đè vẫn tồn tại trong các lần khởi chạy ứng dụng của bạn để Crashlytics có thể tự động thu thập báo cáo. Để từ chối báo cáo sự cố tự động, chuyển false thành giá trị ghi đè. Khi được đặt thành false , giá trị mới sẽ không áp dụng cho đến lần chạy ứng dụng tiếp theo.

    Nhanh
    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
    Mục tiêu-C
    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

Quản lý dữ liệu sự cố

Crash Insights giúp bạn giải quyết các vấn đề bằng cách so sánh dấu vết ngăn xếp ẩn danh của bạn với dấu vết từ các ứng dụng Firebase khác và cho bạn biết nếu sự cố của bạn là một phần của xu hướng lớn hơn. Đố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 sự cố.

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