Im Crashlytics-Dashboard können Sie auf ein Problem klicken, um eine detaillierte Ereignisbericht. Sie können diese Berichte anpassen, um besser nachvollziehen zu können, was in Ihrer App passiert und welche Umstände zu den bei Crashlytics gemeldeten Ereignissen geführt haben.
Instrumentieren Sie Ihre App, um benutzerdefinierte Schlüssel, benutzerdefinierte Lognachrichten und Nutzer-IDs zu erfassen.
Melden Sie Ausnahmen an Crashlytics.
Rufen Sie automatisch Navigationspfade ab, wenn Ihre App die Firebase SDK für Google Analytics Diese Logs geben Ihnen Einblick in Nutzeraktionen, die zu einem von Crashlytics erfassten Ereignis in Ihrer App führen.
Deaktivieren Sie die automatischen Absturzberichte und Aktivieren Sie Opt-in-Berichte für Ihre Nutzer. Wenn Sie standardmäßig erfasst Crashlytics automatisch Absturzberichte für alle Ihre App-Nutzenden.
Benutzerdefinierte Schlüssel hinzufügen
Mit benutzerdefinierten Schlüsseln können Sie den spezifischen Status Ihrer App abrufen, der zu einem Absturz führte. Sie können Ihren Absturzberichten beliebige Schlüssel/Wert-Paare zuordnen und dann die benutzerdefinierten Schlüssel zum Suchen und Filtern von Absturzberichten in der Firebase-Konsole.
- Im Crashlytics-Dashboard können Sie nach Problemen suchen, die mit einem benutzerdefinierten Schlüssel übereinstimmen.
- Wenn Sie ein bestimmtes Problem in der Konsole überprüfen, können Sie die zugehöriger benutzerdefinierter Schlüssel für jedes Ereignis (Unter-Tab Schlüssel) und filtern Sie sogar Ereignisse nach benutzerdefinierten Schlüsseln ändern (Menü Filter oben auf der Seite).
Verwenden Sie die Methode setCustomValue
, um Schlüssel/Wert-Paare festzulegen. Beispiel:
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
Wenn Sie Ganzzahlen, boolesche Werte oder Gleitkommazahlen festlegen, setzen Sie den Wert als @(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"];
Sie können auch den Wert eines vorhandenen Schlüssels ändern, indem Sie den Schlüssel aufrufen und die Einstellung auf einen anderen Wert. Beispiel:
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"];
Fügen Sie Schlüssel/Wert-Paare im Bulk hinzu, indem Sie die Methode setCustomKeysAndValues
mit einem
NSDictionary als einzigen Parameter an:
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];
Benutzerdefinierte Logeinträge hinzufügen
Wenn Sie mehr Kontext zu den Ereignissen erhalten möchten, die zu einem Absturz geführt haben, können Sie Ihrer App benutzerdefinierte Crashlytics-Protokolle hinzufügen. Crashlytics verknüpft die Protokolle mit Ihren Absturzdaten und zeigt sie auf der Crashlytics-Seite der Firebase-Konsole auf dem Tab Protokolle an.
Swift
Verwende log()
oder log(format:, arguments:)
, um Probleme zu ermitteln. Wenn Sie eine nützliche Protokollausgabe mit Nachrichten erhalten möchten, muss das Objekt, das Sie an log()
übergeben, der Eigenschaft CustomStringConvertible
entsprechen. log()
gibt die Beschreibungseigenschaft zurück, die Sie für das Objekt definieren. Beispiel:
Crashlytics.crashlytics().log("Higgs-Boson detected! Bailing out…, \(attributesDict)")
.log(format:, arguments:)
formatiert die vom Aufruf zurückgegebenen Werte
getVaList()
. Beispiel:
Crashlytics.crashlytics().log(format: "%@, %@", arguments: getVaList(["Higgs-Boson detected! Bailing out…", attributesDict]))
Weitere Informationen zur Verwendung von log()
oder log(format:, arguments:)
finden Sie in der Referenzdokumentation zu Crashlytics.
Objective-C
Mit log
oder logWithFormat
können Sie Probleme leichter eingrenzen. Wenn Sie
möchten eine nützliche Protokollausgabe mit Nachrichten erhalten. Das Objekt, das Sie
für beide Methoden das Instanzattribut description
überschreiben.
Beispiel:
[[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];
Weitere Informationen zur Verwendung von log
und logWithFormat
findest du in der
Crashlytics Referenzdokumentation.
Nutzerkennungen festlegen
Um ein Problem zu diagnostizieren, ist es oft hilfreich zu wissen, welche Nutzer eines bestimmten Absturzes. Crashlytics bietet eine Möglichkeit, Nutzer in Ihren Absturzberichten anonym zu identifizieren.
Wenn Sie Ihren Berichten User-IDs hinzufügen möchten, weisen Sie jedem Nutzer eine eindeutige Kennung in Form einer ID-Nummer, eines Tokens oder eines Hashwerts zu:
Swift
Crashlytics.crashlytics().setUserID("123456789")
Objective-C
[[FIRCrashlytics crashlytics] setUserID:@"123456789"];
Wenn Sie eine Nutzer-ID nach dem Festlegen löschen möchten, setzen Sie den Wert auf einen leeren String zurück. Durch das Löschen einer Nutzer-ID werden bestehende Crashlytics Einträge. Datensätze löschen, die mit einem Nutzer verknüpft sind ID, wenden Sie sich an den Firebase-Support.
Nicht schwerwiegende Ausnahmen melden
Mit Crashlytics kannst du nicht nur automatisch App-Abstürze melden, nicht schwerwiegende Ausnahmen aufzeichnen und sie Ihnen senden, wenn Ihre App das nächste Mal Markteinführungen.
Sie können nicht schwerwiegende Ausnahmen aufzeichnen, indem Sie NSError
-Objekte mit der
recordError
-Methode. recordError
erfasst den Aufrufstack des Threads durch Aufruf von
[NSThread callStackReturnAddresses]
.
Swift
Crashlytics.crashlytics().record(error: error)
Objective-C
[[FIRCrashlytics crashlytics] recordError:error];
Bei Verwendung der recordError
-Methode ist es wichtig, die NSError
zu verstehen
und wie Crashlytics die Abstürze verwendet, um Abstürze zu gruppieren. Falsch
Die Verwendung der Methode recordError
kann zu unvorhersehbarem Verhalten führen und
dazu führen, dass Crashlytics die Berichterstellung protokollierter Fehler für deine App einschränkt.
Ein NSError
-Objekt hat drei Argumente:
domain: String
code: Int
userInfo: [AnyHashable : Any]? = nil
Im Gegensatz zu schwerwiegenden Abstürzen, die anhand der Stacktrace-Analyse gruppiert sind,
sind nach domain
und code
gruppiert. Das ist ein wichtiger Unterschied
schwerwiegenden Abstürzen
und protokollierten Fehlern ermitteln. Beispiel:
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];
Wenn du den obigen Fehler protokollierst, wird ein neues Problem erstellt, das nach
NSSomeErrorDomain
und -1001
. Zusätzliche protokollierte Fehler mit denselben Domain- und Codewerten werden unter demselben Problem zusammengefasst. Die Daten im userInfo
-Objekt werden in Schlüssel/Wert-Paare umgewandelt und im Abschnitt „Schlüssel/Protokolle“ einer einzelnen Anfrage angezeigt.
Protokolle und benutzerdefinierte Schlüssel
Wie bei Absturzberichten können Sie Protokolle und benutzerdefinierte Schlüssel einbetten, um dem NSError
Kontext zu verleihen. Es gibt jedoch einen Unterschied zwischen den Protokollen, die mit Abstürzen und protokollierten Fehlern verknüpft sind. Wenn ein Absturz auftritt und die App neu gestartet wird,
Logs, die Crashlytics vom Laufwerk abgerufen hat, sind diejenigen, die bis zu
Zeitpunkt des Absturzes. Wenn du ein NSError
protokollierst, erfasst die App nicht sofort
zu beenden. Da Crashlytics den protokollierten Fehlerbericht erst beim nächsten Starten der App sendet und der Speicherplatz für Protokolle auf dem Laufwerk begrenzt werden muss, ist es möglich, nach der Aufzeichnung eines NSError
genügend Protokolle zu erfassen, damit alle relevanten Protokolle ausgetauscht werden, bis Crashlytics den Bericht vom Gerät sendet. Behalten Sie dieses Guthaben im Hinterkopf, wenn Sie NSErrors
protokollieren und Logs und
benutzerdefinierte Schlüssel in Ihrer App.
Hinweise zur Leistung
Beachten Sie, dass das Logging eines NSError
ziemlich teuer sein kann. Beim Aufruf erfasst Crashlytics den Aufrufstapel des aktuellen Threads mithilfe eines Prozesses, der als Stack-Entschachtelung bezeichnet wird. Dieser Prozess kann CPU- und E/A-intensiv sein,
insbesondere für Architekturen, die DWARF-Unwinding unterstützen (arm64 und x86).
Nach Abschluss des Vorgangs werden die Informationen synchron auf die Festplatte geschrieben.
Dadurch werden Datenverluste verhindert, wenn die nächste Zeile abstürzt.
Es ist zwar sicher, diese API in einem Hintergrund-Thread aufzurufen, aber wenn dieser Aufruf an eine andere Warteschlange gesendet wird, geht der Kontext des aktuellen Stack-Traces verloren.
Was ist mit NSExceptions?
Crashlytics bietet keine Möglichkeit, NSException
-Instanzen direkt zu protokollieren und aufzuzeichnen. Im Allgemeinen sind die Cocoa- und Cocoa Touch-APIs nicht ausnahmesicher. Das bedeutet, dass die Verwendung von @catch
selbst bei äußerster Vorsicht sehr schwerwiegende unbeabsichtigte Nebenwirkungen auf Ihren Prozess haben kann. Sie sollten niemals @catch
-Anweisungen in Ihrem Code verwenden. Weitere Informationen finden Sie unter
Dokumentation von Apple
zu diesem Thema.
Stacktraces anpassen
Wenn Ihre App in einer nicht nativen Umgebung (z. B. C++ oder Unity) ausgeführt wird, können Sie mit der Exception Model API Absturzmetadaten im nativen Ausnahmeformat Ihrer App melden. Gemeldete Ausnahmen werden als nicht schwerwiegende Ausnahmen gekennzeichnet.
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)
Objective-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];
Benutzerdefinierte Stackframes können auch nur mit Adressen initialisiert werden:
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)
Objective-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];
Navigationspfadlogs abrufen
Navigationspfadlogs geben Aufschluss über die Interaktionen eines Nutzers mit Ihrer App, die zu einem Absturz, einem nicht schwerwiegenden Ereignis oder einem ANR-Ereignis geführt haben. Diese Logs können wenn Sie versuchen, ein Problem zu reproduzieren und zu beheben.
Navigationspfade basieren auf Google Analytics. muss Google Analytics aktivieren für Ihr Firebase-Projekt und Firebase SDK für Google Analytics hinzufügen zu Ihrer App hinzufügen. Wenn diese Anforderungen erfüllt sind, werden Navigationspfadlogs automatisch die in den Daten eines Ereignisses auf dem Tab Logs enthalten sind, wenn Sie die Details aufrufen eines Problems.
Das Analytics-SDK
protokolliert automatisch das screen_view
-Ereignis
Dadurch können in den Navigationspfadlogs eine Liste der Bildschirme angezeigt werden, die vor dem Aufruf
nicht schwerwiegenden oder ANR-Ereignis. Ein screen_view
-Navigationspfad-Log enthält ein
firebase_screen_class
-Parameter.
In Navigationspfadlogs benutzerdefinierten Ereignissen, die Sie manuell im Sitzung, einschließlich der Ereignisparameterdaten. Anhand dieser Daten können Sie eine Reihe von Nutzeraktionen nachvollziehen, die zu einem Absturz, einem nicht schwerwiegenden Ereignis oder einem ANR-Ereignis geführt haben.
Sie können die Erhebung und Verwendung von Google Analytics-Daten steuern. Dazu gehören auch die Daten, die in Breadcrumb-Logs eingefügt werden.
Opt-in-Berichte aktivieren
Standardmäßig erfasst Crashlytics automatisch Absturzberichte für alle Ihre App-Nutzenden. Um Nutzern mehr Kontrolle über die von ihnen gesendeten Daten zu geben, können Sie die Funktion „Opt-in-Berichte“ aktivieren. Dazu deaktivieren Sie die automatische Berichterstellung und senden Daten nur dann an Crashlytics, wenn Sie dies in Ihrem Code angeben:
Deaktivieren Sie die automatische Erfassung, indem Sie der Datei
Info.plist
einen neuen Schlüssel hinzufügen:- Schlüssel:
FirebaseCrashlyticsCollectionEnabled
- Wert:
false
- Schlüssel:
Aktivieren Sie die Erhebung für ausgewählte Nutzer, indem Sie die Datenerhebungsüberschreibung Crashlytics zur Laufzeit aufrufen. Der Überschreibungswert bleibt über Markteinführungen deiner App, damit Crashlytics automatisch Berichte erfassen kann.
Wenn Sie die automatische Absturzmeldung deaktivieren möchten, geben Sie
false
als Überschreibungswert an. Wennfalse
festgelegt ist, gilt der neue Wert erst bei der nächsten Ausführung desSwift
Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
Objective-C
[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];
Crash Insights-Daten verwalten
Mit Absturzinformationen können Sie Probleme beheben, indem Sie Ihre anonymisierten Stacktraces mit Traces aus anderen Firebase-Apps vergleichen. Außerdem erfahren Sie, ob Ihr Problem Teil eines größeren Trends ist. Bei vielen Problemen bietet Crash Insights sogar um den Absturz zu beheben.
In Crash Insights werden aggregierte Absturzdaten verwendet, um häufige Stabilitätstrends zu ermitteln. Wenn du keine App-Daten teilen möchtest, kannst du Crash Insights deaktivieren über das Menü Crash Insights über der Problemliste für Crashlytics in der Firebase-Konsole.