Firebase Crashlytics-Absturzberichte anpassen


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.

  • 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. Standardmäßig erfasst Crashlytics automatisch Absturzberichte für alle Nutzer Ihrer App.

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, geben Sie den Wert als @(value) ein.

// 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 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 zu Ihrer Anwendung hinzufügen. 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 Werte, die durch den Aufruf von getVaList() zurückgegeben werden. 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 eine nützliche Protokollausgabe mit Nachrichten erhalten möchten, muss das Objekt, das Sie an eine der beiden Methoden übergeben, 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, bei welchem Nutzer ein bestimmter Absturz aufgetreten ist. 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. Wenn Sie Einträge löschen möchten, die mit einer Nutzer-ID verknüpft sind, 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 fatale Ausnahmen erfassen, indem Sie NSError-Objekte mit der Methode recordError erfassen. recordError erfasst den Aufrufstack des Threads durch Aufrufen 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 führen dazu, 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. 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 Sie den oben genannten Fehler erfassen, wird ein neues Problem erstellt, das nach NSSomeErrorDomain und -1001 gruppiert wird. Zusätzliche protokollierte Fehler, die denselben Domain- und Codewerte sind unter demselben Problem gruppiert. Die Daten im userInfo-Objekt werden in Schlüssel/Wert-Paare umgewandelt und im Abschnitt „Schlüssel/Protokolle“ einer einzelnen Anfrage angezeigt.

Logs und benutzerdefinierte Schlüssel

Genau wie bei Absturzberichten können Sie Protokolle und benutzerdefinierte Schlüssel einbetten, um Kontext NSError. 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 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. 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. So werden Datenverluste verhindert, falls 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 zur Protokollierung und Aufzeichnung von NSException. Instanzen direkt ausführen. 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 in der Dokumentation von Apple.

Stack-Traces anpassen

Wenn Ihre Anwendung in einer nicht nativen Umgebung wie C++ oder Unity ausgeführt wird, können Sie die Exception Model API, um Absturzmetadaten in der nativen Ausnahme Ihrer App zu melden Format. 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.

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 Protokolle 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 Absturz-, nicht schwerwiegenden oder ANR-Ereignisses. Ein screen_view-Navigationspfad-Log enthält einen firebase_screen_class-Parameter.

In Navigationspfadlogs benutzerdefinierten Ereignissen, die Sie manuell im Sitzung, einschließlich der Ereignisparameterdaten. Anhand dieser Daten kann eine Reihe von Nutzeraktionen, die zu einem Absturz, nicht schwerwiegenden oder 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 Nutzer Ihrer App. 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:

  1. Deaktivieren Sie die automatische Erfassung, indem Sie der Datei Info.plist einen neuen Schlüssel hinzufügen:

    • Schlüssel: FirebaseCrashlyticsCollectionEnabled
    • Wert: false
  2. 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. Wenn dieser Wert auf false festgelegt ist, wird der neue Wert erst bei der nächsten Ausführung der App angewendet.

    Swift

    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 finden Sie in Crash Insights sogar Ressourcen, die Ihnen bei der Fehlerbehebung helfen.

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.