Im Crashlytics-Dashboard können Sie auf ein Problem klicken, um eine detaillierte Ereignisbericht. Sie können diese Berichte anpassen, um ein besseres Verständnis was in Ihrer App vor sich geht, und unter welchen Umständen die Ereignisse gemeldet werden, Crashlytics
Instrumentieren Sie Ihre Anwendung, um benutzerdefinierte Schlüssel zu protokollieren. benutzerdefinierte Logeinträge und Nutzerkennungen.
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 ermitteln, 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 sich ein bestimmtes Problem in der Console ansehen, können Sie sich die zugehörigen benutzerdefinierten Schlüssel für jedes Ereignis ansehen (Untertab Schlüssel) und die Ereignisse sogar nach benutzerdefinierten Schlüsseln filtern (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 einen anderen Wert festlegen. 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 Protokollmeldungen hinzufügen
Wenn Sie mehr über die Ereignisse erfahren möchten, die zu einem Absturz geführt haben, können Sie benutzerdefinierte Crashlytics-Logs an Ihre Anwendung senden. Crashlytics verknüpft die Logs mit Ihren Absturzdaten und zeigt sie auf der Crashlytics-Seite der Firebase auf dem Tab Logs.
Swift
Verwende log()
oder log(format:, arguments:)
, um Probleme zu ermitteln. Wenn Sie
möchten eine nützliche Protokollausgabe mit Nachrichten erhalten. Das Objekt, das Sie an
log()
muss den
CustomStringConvertible
Property. log()
gibt das Attribut „description“ [Beschreibung] zurück, das Sie für
des Objekts. 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:)
siehe Crashlytics
Referenzdokumentation.
Objective-C
Verwende log
oder logWithFormat
, um Probleme zu ermitteln. Wenn Sie
möchten eine nützliche Log-Ausgabe mit Nachrichten, dem 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.
Nutzer-IDs festlegen
Um ein Problem zu diagnostizieren, ist es oft hilfreich zu wissen, welche Nutzer eines bestimmten Absturzes. Crashlytics bietet eine Möglichkeit zur anonymen Identifizierung von Nutzern in Ihre Absturzberichte.
Um Ihren Berichten User-IDs hinzuzufügen, weisen Sie jedem Nutzer eine eindeutige Kennung in der Form einer ID-Nummer, eines Tokens oder eines Hash-Werts:
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. Eine falsche Verwendung der recordError
-Methode kann zu unvorhersehbarem Verhalten führen und dazu, dass Crashlytics die Meldung von protokollierten Fehlern für Ihre 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. Dies ist ein wichtiger Unterschied zwischen schwerwiegenden Abstürzen und protokollierten Fehlern. 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, die denselben
Domain- und Codewerte sind unter demselben Problem gruppiert. Daten in
userInfo
-Objekt werden in Schlüssel/Wert-Paare umgewandelt und im
Schlüssel/Logs eines einzelnen Problems.
Logs 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 darin, welchen Protokolle
Abstürzen im Vergleich zu protokollierten Fehlern. Wenn ein Absturz auftritt und die App neu gestartet wird,
Logs, die Crashlytics vom Laufwerk abgerufen hat, sind diejenigen, die bis zu
zum Zeitpunkt des Absturzes. Wenn du ein NSError
protokollierst, erfasst die App nicht sofort
zu beenden. Da Crashlytics den protokollierten Fehlerbericht nur für die
für den nächsten App-Start bereitgestellt
und den Speicherplatz für Logs auf der Festplatte begrenzt,
ist es möglich, genug Daten zu protokollieren, nachdem NSError
erfasst wurden, sodass alle relevanten
werden die Logs um den Zeitpunkt rotiert, zu dem Crashlytics den Bericht vom
. Berücksichtigen Sie dieses Gleichgewicht, wenn Sie NSErrors
protokollieren und Protokolle und benutzerdefinierte Schlüssel in Ihrer App verwenden.
Hinweise zur Leistung
Beachten Sie, dass das Logging eines NSError
ziemlich teuer sein kann. Zu dem Zeitpunkt,
den Aufruf ausführen, erfasst Crashlytics den Aufrufstack des aktuellen Threads mithilfe einer
Stack Unwinding zu arbeiten. 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.
Anrufe sind sicher diese API in einem Hintergrundthread. Wenn Sie diesen Aufruf an eine andere verliert den Kontext des aktuellen Stacktrace.
Was ist mit NSExceptions?
Crashlytics bietet keine Möglichkeit, NSException
-Instanzen direkt zu protokollieren und aufzuzeichnen. Im Allgemeinen sind die Cocoa API und die Cocoa Touch API nicht
Ausnahmesicher. Die Verwendung von @catch
kann also schwerwiegende unbeabsichtigte Folgen haben.
Nebenwirkungen in Ihrem Prozess hat, auch wenn sie mit äußerster Sorgfalt verwendet wird. Sie sollten niemals
Verwenden Sie in Ihrem Code @catch
-Anweisungen. 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];
Frames für benutzerdefinierte Stapel 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];
Navigationspfad-Logs abrufen
In Navigationspfadlogs erhalten Sie einen besseren Überblick über die Interaktionen, die zu einem Absturz, nicht schwerwiegenden oder ANR-Ereignis geführt haben. Diese Logs können wenn Sie versuchen, ein Problem zu reproduzieren und zu beheben.
Breadcrumb-Protokolle werden von Google Analytics unterstützt. Wenn Sie also breadcrumb-Protokolle erhalten möchten, müssen Sie Google Analytics für Ihr Firebase-Projekt aktivieren und Ihrer App das Firebase SDK für Google Analytics hinzufügen. Sobald diese Anforderungen erfüllt sind, werden breadcrumb-Protokolle automatisch in den Daten eines Ereignisses auf dem Tab Protokolle angezeigt, wenn Sie sich die Details eines Problems ansehen.
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 Absturz-, nicht schwerwiegenden oder ANR-Ereignisses. 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 Erhebung und Verwendung von Google Analytics-Daten kontrollieren, einschließlich der Daten, mit denen Navigationspfadlogs gefüllt werden.
Opt-in-Berichte aktivieren
Standardmäßig erfasst Crashlytics automatisch Absturzberichte für alle Ihre App-Nutzenden. Um Nutzern mehr Kontrolle über die gesendeten Daten zu geben, können Sie indem Sie die automatische Berichterstellung deaktivieren und Daten nur an Crashlytics, wenn Sie Folgendes im Code auswählen:
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 Crashlytics-Daten aufrufen Sammlungsüberschreibung während der Laufzeit. Der Überschreibungswert bleibt über Markteinführungen deiner App, damit Crashlytics automatisch Berichte erfassen kann.
Wenn Sie automatische Absturzberichte deaktivieren möchten, übergeben Sie
false
als Überschreibungswert. 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 Crash Insights können Sie Ihren anonymisierten Stack vergleichen und Probleme beheben zu Traces von anderen Firebase-Apps und teilen Ihnen mit, ob das Problem Teil eines größeren Trends sind. 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 identifizieren. Wenn Sie die Daten Ihrer App nicht freigeben möchten, können Sie Crash Insights oben in der Liste der Crashlytics-Probleme in der Firebase-Konsole im Menü Crash Insights deaktivieren.