在 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")
Objective-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 控制台的「記錄檔」分頁標籤下方的 Crashlytics 頁面中顯示這些資料。
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
使用 log
或 logWithFormat
來找出問題。請注意,
想要取得內含訊息的實用記錄輸出,也就是您傳送的物件
任一方法都必須覆寫 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];
如要進一步瞭解如何使用 log
和 logWithFormat
,請參閱
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
與透過堆疊追蹤分析進行分組的致命當機不同,記錄的錯誤會依 domain
和 code
分組。這是一項重要的差異
。例如:
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 (選擇在程式碼中執行時):
如要關閉自動收集功能,請在
Info.plist
檔案中新增一個鍵:- 鍵:
FirebaseCrashlyticsCollectionEnabled
- 值:
false
- 鍵:
呼叫 Crashlytics 資料,為特定使用者啟用收集功能 會在執行階段覆寫集合覆寫覆寫值 啟用的應用程式,以便Crashlytics自動收集報表。
如要停用自動當機回報功能,請傳遞
false
做為覆寫值。如果設為false
,新的值必須等到下次執行 應用程式。Swift
Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
Objective-C
[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];
管理當機深入分析資料
當機深入分析會比較匿名堆疊,協助你解決問題 追蹤其他 Firebase 應用程式的追蹤記錄,讓你瞭解問題是否 一部分的趨勢針對許多問題,Crash Insights 甚至提供資源,協助您偵錯當機情形。
Crash Insights 會使用匯總的當機資料,找出常見的穩定性趨勢。 如果不想分享應用程式資料,可以選擇停用「當機深入分析」 前往 Crashlytics 問題清單頂端的「當機深入分析」選單 Firebase 控制台中。