自訂 Firebase Crashlytics 當機報告

在 Crashlytics 資訊主頁中,您可以點選問題瞭解詳細資訊 事件報表你可以自訂報表,進一步瞭解 您應用程式中的動態,以及回報給以下事件的相關情況 Crashlytics。

  • 如果您的應用程式使用 Google Analytics 專用 Firebase SDK。這些記錄檔可讓您 會導致應用程式中產生 Crashlytics 收集事件的使用者動作。

  • 關閉自動當機回報功能 為使用者啟用選用報告。請注意 根據預設,Crashlytics 會自動收集所有應用程式的當機報告 觸及應用程式使用者

新增自訂鍵

你可以使用自訂鍵,取得導致當機情況的應用程式特定狀態。 您可以將任意鍵/值組合與當機報告建立關聯, 自訂鍵,即可在 Firebase 控制台中搜尋及篩選當機報告。

  • 你可以在 Crashlytics 資訊主頁中搜尋問題 符合自訂鍵的條件
  • 在控制台中查看特定問題時,可以查看 個別事件的相關自訂鍵 (「鍵」子分頁),甚至篩選 事件 (按頁面頂端的「篩選器」選單)。

請使用 setCustomValue 方法設定鍵/值組合。例如:

Swift

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

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

目標-C

設定整數、布林值或浮點數時,請將值方塊設為 @(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"];

您也可以透過呼叫鍵和設定,修改現有鍵的值 改為不同的值例如:

Swift

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

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

目標-C

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

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

使用 setCustomKeysAndValues 方法和 NSDictionary 做為唯一的參數:

Swift

let keysAndValues = [
                 "string key" : "string value",
                 "string key 2" : "string value 2",
                 "boolean key" : true,
                 "boolean key 2" : false,
                 "float key" : 1.01,
                 "float key 2" : 2.02
                ] as [String : Any]

Crashlytics.crashlytics().setCustomKeysAndValues(keysAndValues)

目標-C

NSDictionary *keysAndValues =
    @{@"string key" : @"string value",
      @"string key 2" : @"string value 2",
      @"boolean key" : @(YES),
      @"boolean key 2" : @(NO),
      @"float key" : @(1.01),
      @"float key 2" : @(2.02)};

[[FIRCrashlytics crashlytics] setCustomKeysAndValues: keysAndValues];

新增自訂記錄訊息

如要進一步查看引發當機事件的事件背景資訊,您可以新增 自訂應用程式的 Crashlytics 記錄檔Crashlytics 會將記錄與 並與當機資料一併顯示在 Firebase 控制台 (位於「記錄檔」分頁下)。

Swift

使用log()log(format:, arguments:)協助找出問題。如果發生以下情況: 想要取得內含訊息的實用記錄輸出,也就是您傳遞至 log() 必須遵守 CustomStringConvertible 資源。log() 會傳回您定義的描述屬性 物件。例如:

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

呼叫傳回的 .log(format:, arguments:) 格式值 getVaList()。例如:

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

若想進一步瞭解如何使用 log()log(format:, arguments:), 請參閱 Crashlytics 請參閱參考說明文件

目標-C

使用loglogWithFormat協助找出問題。請注意, 想要取得內含訊息的實用記錄輸出,也就是您傳送的物件 任一方法都必須覆寫 description 例項屬性。 例如:

[[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];

如要進一步瞭解如何使用 loglogWithFormat,請參閱 Crashlytics 參考說明文件

設定使用者 ID

瞭解使用者遇到哪些問題,通常有助於診斷問題 處理特定當機問題Crashlytics 提供一種匿名辨識功能, 顯示當機報告

如要在報表中加入 User-ID,請為每位使用者指派專屬 ID 形式的 ID 編號、符記或雜湊值:

Swift

Crashlytics.crashlytics().setUserID("123456789")

目標-C

[[FIRCrashlytics crashlytics] setUserID:@"123456789"];

如果您在設定好使用者 ID 後需要清除,請將值重設為 空白字串清除使用者 ID 並不會將現有資料移除 Crashlytics 記錄。如何刪除與使用者相關聯的記錄 ID,請與 Firebase 支援團隊聯絡

回報不嚴重的例外狀況

除了自動回報應用程式的當機情形,Crashlytics 還可讓您 記錄不嚴重的例外狀況,並在下次應用程式時傳送 發布內容。

您可以使用NSError recordError 方法。recordError 會呼叫 [NSThread callStackReturnAddresses]

Swift

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

目標-C

[[FIRCrashlytics crashlytics] recordError:error];

使用 recordError 方法時,請務必瞭解 NSError 以及 Crashlytics 如何運用資料分類當機事件錯誤內容 使用 recordError 方法可能會導致發生無法預期的行為,並可能導致 會導致 Crashlytics 只能報告應用程式的記錄錯誤。

NSError 物件有三個引數:

  • domain: String
  • code: Int
  • userInfo: [AnyHashable : Any]? = nil

與嚴重當機 (依堆疊追蹤分析分類) 不同,系統會記錄錯誤 分組依據為 domaincode。這是一項重要的差異 。例如:

Swift

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)

目標-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];

記錄上述錯誤時,系統會建立新問題並按分類依據 《NSSomeErrorDomain》和《-1001》。其他 網域及代碼值則會歸入同一個問題。包含的資料 userInfo 物件會轉換為鍵/值組合,並顯示在 個別問題中的金鑰/記錄部分。

記錄檔和自訂鍵

和當機報告一樣,您可以嵌入記錄和自訂鍵,藉此提供背景資訊 NSError。然而,附加和記錄的記錄不同 當機與記錄錯誤如果系統當機並重新啟動應用程式, 記錄 Crashlytics 從磁碟擷取的記錄檔類型 當機時間。記錄 NSError 時,應用程式不會立即生效 終止服務。因為 Crashlytics 只會針對 並在下次啟動應用程式時限制磁碟上記錄檔的儲存空間容量。 記錄 NSError 後即可足夠記錄,進而 但會在 Crashlytics 傳送報告時 裝置。記錄 NSErrors 及使用記錄檔和 自訂鍵。

效能注意事項

請注意,記錄 NSError 的成本可能相當高昂。當您 發出呼叫,Crashlytics 會使用 稱為堆疊展開程序這項程序可能會耗用大量 CPU 和 I/O 資源 尤其是支援 DWARF 解開架構 (arm64 和 x86) 的架構。 放鬆完成後,所有資訊都會同步寫入磁碟。 這樣可以防止下一行當機時資料遺失。

這個做法可以安心撥打電話 請記住,將這項呼叫分派給另一個 佇列會失去目前堆疊追蹤的結構定義。

NSExceptions 呢?

Crashlytics 未提供記錄與記錄功能「NSException」 執行個體。一般來說,Cocoa 和 Cocoa Touch API 例外狀況。這表示使用 @catch 時,可能產生了非常嚴重的預期 生理過程中的副作用,即使在過度謹慎使用時也一樣。無論如何 請在程式碼中使用 @catch 陳述式。詳情請參閱 Apple 說明文件 以及相關主題

自訂堆疊追蹤

如果應用程式在非原生環境 (例如 C++ 或 Unity) 中執行,您可以使用 透過 Exception Model API 回報應用程式原生例外狀況中的當機中繼資料 格式。回報的例外狀況會標示為非嚴重錯誤。

Swift

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

crashlytics.record(exceptionModel:ex)

目標-C

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

[[FIRCrashlytics crashlytics] recordExceptionModel:model];

也可以只使用地址來初始化自訂堆疊框架:

Swift

var  ex = ExceptionModel.init(name:"FooException", reason:"There was a foo.")
ex.stackTrace = [
  StackFrame(address:0xfa12123),
  StackFrame(address:12412412),
  StackFrame(address:194129124),
]

crashlytics.record(exceptionModel:ex)

目標-C

FIRExceptionModel *model =
    [FIRExceptionModel exceptionModelWithName:@"FooException" reason:@"There was a foo."];
model.stackTrace = @[
  [FIRStackFrame stackFrameWithAddress:0xfa12123],
  [FIRStackFrame stackFrameWithAddress:12412412],
  [FIRStackFrame stackFrameWithAddress:194129124],
];


[[FIRCrashlytics crashlytics] recordExceptionModel:model];

取得導覽標記記錄

導覽標記記錄可讓您進一步瞭解使用者的互動情形 引發當機、一般錯誤或 ANR 事件。這些記錄檔 有助於重現並偵錯。

導覽標記記錄是由 Google Analytics 技術提供,因此如要取得導覽標記記錄, 需要 啟用 Google Analytics加入 Google Analytics 專用 Firebase SDK 導入您的應用程式一旦符合這些需求,導覽標記記錄就會自動 查看詳細資料時,「記錄」分頁中的事件資料會一併附上 並不瞭解該問題的來龍去脈

Analytics SDK 自動記錄 screen_view 事件 讓導覽標記記錄顯示 當機、一般錯誤或 ANR 事件screen_view 導覽標記記錄中包含 firebase_screen_class 參數。

系統也會填入導覽標記記錄 您在使用者的帳戶中手動記錄的自訂事件 ,包括事件的參數資料。這項資料有助於顯示一系列 觸發引發當機、一般錯誤或 ANR 事件的使用者動作。

請注意,您可以 控管 Google Analytics 資料的收集和使用方式, 包括填入導覽標記記錄的資料。

啟用自選回報功能

根據預設,Crashlytics 會自動收集 觸及應用程式使用者如要讓使用者進一步控管他們傳送的資料,您可以啟用 供使用者選擇使用報告,即可停用自動報告功能,並僅將資料傳送給 Crashlytics 以產生程式碼的形式:

  1. Info.plist 檔案中新增金鑰即可關閉自動收集功能:

    • 鍵:FirebaseCrashlyticsCollectionEnabled
    • 值:false
  2. 呼叫 Crashlytics 資料,為特定使用者啟用收集功能 會在執行階段覆寫集合覆寫覆寫值 方便 Crashlytics 自動收集報表

    如要停用自動當機回報功能,請傳遞 false 做為覆寫值。 如果設為 false,新的值必須等到下次執行 應用程式。

    Swift

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)

    目標-C

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

管理當機深入分析資料

當機深入分析會比較匿名堆疊,協助你解決問題 追蹤其他 Firebase 應用程式的追蹤記錄,讓你瞭解問題是否 一部分的趨勢許多問題甚至能透過 Crash Insights 提供的資源 來協助偵測當機問題

Crash Insights 會使用匯總的當機資料,找出常見的穩定性趨勢。 如果不想分享應用程式資料,可以選擇停用「當機深入分析」 開啟 Crashlytics 問題清單頂端的「當機深入分析」選單 Firebase 控制台