自訂 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")

Objective-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)

Objective-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 可將記錄建立關聯 檢視您的當機資料,並在以下網址的 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 參考說明文件

Objective-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 還可讓您記錄非嚴重例外狀況,並在下次啟動應用程式時傳送給您。

您可以使用 recordError 方法記錄 NSError 物件,藉此記錄非致命的例外狀況。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)

Objective-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) 中執行,您可以使用例外狀況模型 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 提供支援,因此如要取得麵包屑記錄,您必須為 Firebase 專案啟用 Google Analytics,並Google Analytics 的 Firebase SDK 新增至應用程式。滿足這些需求後,您查看問題詳細資料時,系統就會在「Logs」分頁中,自動將麵包屑記錄與事件資料一併顯示。

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)

    Objective-C

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

管理當機深入分析資料

當機深入分析功能會將您的去識別化堆疊追蹤與其他 Firebase 應用程式的追蹤記錄進行比較,協助您解決問題,並讓您瞭解問題是否屬於更廣泛的趨勢。針對許多問題,Crash Insights 甚至提供資源,協助您偵錯當機情形。

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