Absturzberichte für Apple-Plattformen anpassen

Plattform auswählen : iOS+ Android Flutter Unity


Im Crashlytics Dashboard können Sie auf ein Problem klicken, um einen detaillierten Ereignisbericht zu erhalten. Sie können diese Berichte anpassen, um besser zu verstehen, was in Ihrer App passiert und welche Umstände zu den Ereignissen geführt haben, die an Crashlytics gemeldet wurden.

Benutzerdefinierte Schlüssel hinzufügen

Mit benutzerdefinierten Schlüsseln können Sie den spezifischen Status Ihrer App abrufen, der zu einem Absturz geführt hat. Sie können Ihren Absturzberichten beliebige Schlüssel/Wert-Paare zuordnen und dann mit den benutzerdefinierten Schlüsseln in der Firebase Console nach Absturzberichten suchen und sie filtern.

  • Im Crashlytics Dashboard können Sie nach Problemen suchen, die einem benutzerdefinierten Schlüssel entsprechen.
  • Wenn Sie ein bestimmtes Problem in der Console untersuchen, können Sie die zugehörigen benutzerdefinierten Schlüssel für jedes Ereignis auf dem Untertab Schlüssel aufrufen 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 in @(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 den Wert eines vorhandenen Schlüssels auch ä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"];

Verwenden Sie die Methode setCustomKeysAndValues mit einem NSDictionary als einzigen Parameter, um Schlüssel/Wert-Paare in großen Mengen hinzuzufügen:

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 Logmeldungen hinzufügen

Um mehr Kontext zu den Ereignissen zu erhalten, die zu einem Absturz geführt haben, können Sie Ihrer App benutzerdefinierte Crashlytics Logs hinzufügen. Crashlytics verknüpft die Logs mit Ihren Absturzdaten und zeigt sie auf der Crashlytics Seite der Firebase Konsole auf dem Tab Logs an.

Swift

Verwenden Sie log() oder log(format:, arguments:), um Probleme zu identifizieren. Wenn Sie eine nützliche Logausgabe mit Meldungen erhalten möchten, muss das Objekt, das Sie an log() übergeben, der CustomStringConvertible Eigenschaft 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 Werte, die durch Aufrufen 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:), finden Sie in der Crashlytics Referenzdokumentation.

Objective-C

Verwenden Sie log oder logWithFormat, um Probleme zu identifizieren. Wenn Sie eine nützliche Logausgabe mit Meldungen erhalten möchten, muss das Objekt, das Sie an eine der beiden Methoden übergeben, die Instanzeigenschaft 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 finden Sie in der Crashlytics Referenzdokumentation.

Nutzerkennungen festlegen

Um ein Problem zu diagnostizieren, ist es oft hilfreich zu wissen, bei welchen Nutzern ein bestimmter Absturz aufgetreten ist. Crashlytics bietet eine Möglichkeit, Nutzer in Ihren Absturzberichten anonym zu identifizieren.

Wenn Sie Ihren Berichten Nutzer-IDs hinzufügen möchten, weisen Sie jedem Nutzer eine eindeutige Kennung in Form einer ID-Nummer, eines Tokens oder eines gehashten Werts zu:

Swift

Crashlytics.crashlytics().setUserID("123456789")

Objective-C

[[FIRCrashlytics crashlytics] setUserID:@"123456789"];

Wenn Sie eine Nutzerkennung nach dem Festlegen löschen müssen, setzen Sie den Wert auf einen leeren String zurück. Durch das Löschen einer Nutzerkennung werden keine vorhandenen Crashlytics Einträge entfernt. Wenn Sie Einträge löschen müssen, die mit einer Nutzer ID verknüpft sind, wenden Sie sich an den Firebase-Support.

Nicht schwerwiegende Ausnahmen melden

Crashlytics meldet nicht nur automatisch Abstürze Ihrer App, Crashlytics ermöglicht Ihnen auch, nicht schwerwiegende Ausnahmen zu erfassen und sie beim nächsten Start Ihrer App zu senden.

Sie können nicht schwerwiegende Ausnahmen erfassen, indem Sie NSError-Objekte mit der Methode recordError aufzeichnen. 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 Methode recordError ist es wichtig, die Struktur von NSError und die Verwendung der Daten durch Crashlytics zum Gruppieren von Abstürzen zu verstehen. Eine falsche Verwendung der Methode recordError kann zu unvorhersehbarem Verhalten führen und dazu, dass Crashlytics die Meldung protokollierter Fehler 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 über die Stacktrace-Analyse gruppiert werden, werden protokollierte Fehler 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 protokollieren, wird ein neues Problem erstellt, das nach NSSomeErrorDomain und -1001 gruppiert wird. Zusätzliche protokollierte Fehler, die dieselben Werte für Domain und Code verwenden, werden unter demselben Problem gruppiert. Die im Objekt userInfo enthaltenen Daten werden in Schlüssel/Wert-Paare umgewandelt und im Bereich „Schlüssel/Logs“ eines einzelnen Problems angezeigt.

Logs und benutzerdefinierte Schlüssel

Wie bei Absturzberichten können Sie Logs und benutzerdefinierte Schlüssel einbetten, um dem NSError Kontext hinzuzufügen. Es gibt jedoch einen Unterschied zwischen den Logs, die an Abstürze angehängt werden, und den Logs, die an protokollierte Fehler angehängt werden. Wenn ein Absturz auftritt und die App neu gestartet wird, ruft Crashlytics die Logs Crashlytics vom Laufwerk ab, die bis zu dem Zeitpunkt des Absturzes geschrieben wurden. Wenn Sie ein NSError protokollieren, wird die App nicht sofort beendet. Da Crashlytics den Bericht über protokollierte Fehler erst beim nächsten Start der App sendet und die Menge an Speicherplatz für Logs auf dem Laufwerk begrenzen muss, ist es möglich, nach der Aufzeichnung eines NSError genügend zu protokollieren, sodass alle relevanten Logs rotiert werden, bevor Crashlytics den Bericht vom Gerät sendet. Berücksichtigen Sie dieses Gleichgewicht, wenn Sie NSErrors protokollieren und Logs und benutzerdefinierte Schlüssel in Ihrer App verwenden.

Hinweise zur Leistung

Das Protokollieren eines NSError kann recht aufwendig sein. Zum Zeitpunkt des Aufrufs erfasst Crashlytics den Aufrufstack des aktuellen Threads mithilfe eines Prozesses namens Stack Unwinding. Dieser Prozess kann CPU- und E/A-intensiv sein, insbesondere bei Architekturen, die DWARF Unwinding unterstützen (arm64 und x86). Nach Abschluss des Unwinding werden die Informationen synchron auf das Laufwerk geschrieben. So wird Datenverlust verhindert, wenn die nächste Zeile abstürzt.

Sie können diese API zwar sicher in einem Hintergrundthread aufrufen, aber wenn Sie diesen Aufruf an eine andere Warteschlange senden, geht der Kontext des aktuellen Stacktrace 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 sehr schwerwiegende unbeabsichtigte Nebenwirkungen in Ihrem Prozess haben kann, selbst wenn sie mit äußerster Sorgfalt verwendet wird. Sie sollten @catch-Anweisungen niemals in Ihrem Code verwenden. Weitere Informationen finden Sie in der 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 schwerwiegend markiert.

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 Ihnen einen besseren Einblick in 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 hilfreich sein, wenn Sie versuchen, ein Problem zu reproduzieren und zu beheben.

Navigationspfadlogs werden von Google Analytics unterstützt. Um sie zu erhalten, müssen Sie Google Analytics für Ihr Firebase-Projekt aktivieren und das Firebase SDK für Google Analytics zu Ihrer App hinzufügen. Sobald diese Voraussetzungen erfüllt sind, werden Navigationspfadlogs automatisch in die Ereignisdaten auf dem Tab **Logs** aufgenommen, wenn Sie die Details eines Problems aufrufen.Google Analytics

Das Analytics SDK protokolliert automatisch das Ereignis screen_view, sodass in den Navigationspfadlogs eine Liste der Bildschirme angezeigt wird, die vor dem Absturz, dem nicht schwerwiegenden Ereignis oder dem ANR-Ereignis aufgerufen wurden. Ein screen_view-Navigationspfadlog enthält einen firebase_screen_class-Parameter.

Navigationspfadlogs werden auch mit allen benutzerdefinierten Ereignissen gefüllt, die Sie manuell in der Sitzung des Nutzers protokollieren, einschließlich der Parameterdaten des Ereignisses. Anhand dieser Daten lässt sich eine Reihe von Nutzeraktionen darstellen, 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, einschließlich der Daten, die in Navigationspfadlogs verwendet werden.

Opt-in-Meldung aktivieren

Standardmäßig erfasst Crashlytics automatisch Absturzberichte für alle Nutzer Ihrer App. Wenn Sie Nutzern mehr Kontrolle über die von ihnen gesendeten Daten geben möchten, können Sie die Opt-in-Meldung aktivieren, indem Sie die automatische Meldung deaktivieren und Daten nur dann an Crashlytics senden, wenn Sie dies in Ihrem Code festlegen.

  1. Deaktivieren Sie die automatische Erhebung, 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 erhebungsüberschreibung zur Laufzeit aufrufen. Der Überschreibungswert bleibt bei allen nachfolgenden Starts Ihrer App bestehen, sodass Crashlytics automatisch Berichte für diesen Nutzer erheben kann.

    Swift

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)

    Objective-C

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

    Wenn der Nutzer die Datenerhebung später deaktiviert, können Sie false als Überschreibungswert übergeben. Dieser Wert wird beim nächsten Start der App angewendet und bleibt bei allen nachfolgenden Starts für diesen Nutzer bestehen.

Crash Insights-Daten verwalten

Crash Insights hilft Ihnen, Probleme zu beheben, indem es Ihre anonymisierten Stacktraces mit Traces aus anderen Firebase-Apps vergleicht und Sie darüber informiert, ob Ihr Problem Teil eines größeren Trends ist. Für viele Probleme bietet Crash Insights sogar Ressourcen, die Ihnen bei der Fehlerbehebung helfen.

Crash Insights verwendet aggregierte Absturzdaten, um allgemeine Stabilitätstrends zu ermitteln. Wenn Sie die Daten Ihrer App nicht freigeben möchten, können Sie Crash Insights über das Crash Insights Menü oben in der Crashlytics Liste in der Firebase Console deaktivieren.

Nächste Schritte