Google is committed to advancing racial equity for Black communities. See how.
Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Passen Sie Ihre Firebase Crashlytics-Absturzberichte an

In diesem Handbuch wird beschrieben, wie Sie Ihre Absturzberichte mithilfe des Firebase Crashlytics SDK anpassen. Standardmäßig sammelt Crashlytics automatisch Absturzberichte für alle Benutzer Ihrer App (Sie können die automatische Absturzberichterstattung deaktivieren und stattdessen die Opt-In-Berichterstellung für Ihre Benutzer aktivieren ). Crashlytics bietet sofort vier Protokollierungsmechanismen: benutzerdefinierte Schlüssel , benutzerdefinierte Protokolle , Benutzerkennungen und abgefangene Ausnahmen .

Fügen Sie benutzerdefinierte Schlüssel hinzu

Mit benutzerdefinierten Schlüsseln können Sie den spezifischen Status Ihrer App ermitteln, der zu einem Absturz führt. Sie können Ihren Absturzberichten beliebige Schlüssel / Wert-Paare zuordnen und diese in der Firebase-Konsole anzeigen .

Verwenden Sie die setCustomValue Methode, um Schlüssel / Wert-Paare setCustomValue . Beispielsweise:

Schnell

// Set int_key to 100.
Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key")

// Set str_key to "hello".
Crashlytics.crashlytics().setCustomValue("hello", forKey: "str_key")

Ziel c

Wenn Sie Ganzzahlen, Boolesche Werte oder Gleitkommazahlen festlegen, geben 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 den Wert eines vorhandenen Schlüssels auch ändern, indem Sie den Schlüssel aufrufen und auf einen anderen Wert setzen. Beispielsweise:

Schnell

Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key")

// Set int_key to 50 from 100.
Crashlytics.crashlytics().setCustomValue(50, forKey: "int_key")

Ziel 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 benutzerdefinierte Protokollnachrichten hinzu

Um sich mehr Kontext für die Ereignisse zu verschaffen, die zu einem Absturz führen, können Sie Ihrer App benutzerdefinierte Crashlytics-Protokolle hinzufügen. Crashlytics ordnet die Protokolle Ihren Absturzdaten zu und zeigt sie auf der Crashlytics-Seite der Firebase-Konsole auf der Registerkarte Protokolle an .

Schnell

Verwenden Sie log() oder log(format:, arguments:) , um Probleme zu lokalisieren. Wenn Sie eine nützliche Protokollausgabe mit Nachrichten erhalten möchten, muss das Objekt, das Sie an log() , der CustomStringConvertible Eigenschaft entsprechen. log() gibt die Beschreibungseigenschaft zurück, die Sie für das Objekt definiert haben. Beispielsweise:

Crashlytics.crashlytics().log("Higgs-Boson detected! Bailing out…, \( attributesDict )")

.log(format:, arguments:) formatiert Werte, die vom Aufruf von getVaList() . Beispielsweise:

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 den Crashlytics- Funktionen .

Ziel c

Verwenden Sie log oder logWithFormat , um Probleme zu lokalisieren. Beachten Sie, dass das Objekt, das Sie an eine der beiden Methoden übergeben, die Eigenschaft der description überschreiben muss, wenn Sie eine nützliche Protokollausgabe mit Nachrichten erhalten möchten. Beispielsweise:

[[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 Referenzdokumentation zu den Crashlytics- Funktionen .

Legen Sie Benutzer-IDs fest

Um ein Problem zu diagnostizieren, ist es oft hilfreich zu wissen, welcher Ihrer Benutzer einen bestimmten Absturz hatte. Crashlytics bietet eine Möglichkeit, Benutzer in Ihren Absturzberichten anonym zu identifizieren.

Um Ihren Berichten Benutzer-IDs hinzuzufügen, weisen Sie jedem Benutzer eine eindeutige Kennung in Form einer ID-Nummer, eines Tokens oder eines Hash-Werts zu:

Schnell
Crashlytics.crashlytics().setUserID("123456789")
Ziel c
[[FIRCrashlytics crashlytics] setUserID:@"123456789"];

Wenn Sie jemals eine Benutzerkennung löschen müssen, nachdem Sie sie festgelegt haben, setzen Sie den Wert auf eine leere Zeichenfolge zurück. Durch das Löschen einer Benutzerkennung werden vorhandene Crashlytics-Datensätze nicht entfernt. Wenn Sie Datensätze löschen müssen, die einer Benutzer-ID zugeordnet sind, wenden Sie sich an den Firebase-Support .

Nicht schwerwiegende Ausnahmen melden

Mit Crashlytics können Sie nicht nur automatisch Abstürze Ihrer App melden, sondern auch nicht schwerwiegende Ausnahmen aufzeichnen und diese beim nächsten Start Ihrer App an Sie senden.

Sie können nicht schwerwiegende Ausnahmen aufzeichnen, indem Sie NSError Objekte mit der recordError Methode recordError . recordError erfasst den Aufrufstapel des Threads durch Aufrufen von [NSThread callStackReturnAddresses] .

Schnell

Crashlytics.crashlytics().record(error: error )

Ziel c

[[FIRCrashlytics crashlytics] recordError: error ];

Bei Verwendung der recordError Methode ist es wichtig, die NSError Struktur und die Verwendung der Daten durch Crashlytics zum Gruppieren von Abstürzen zu verstehen. Eine falsche Verwendung der recordError Methode 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 Stack-Trace-Analyse gruppiert werden, werden protokollierte Fehler nach domain und code gruppiert. Dies ist eine wichtige Unterscheidung zwischen schwerwiegenden Abstürzen und protokollierten Fehlern. Beispielsweise:

Schnell

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)

Ziel 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 obigen Fehler protokollieren, wird ein neues Problem erstellt, das nach NSSomeErrorDomain und -1001 gruppiert ist. Zusätzliche protokollierte Fehler, die dieselben Domänen- und Codewerte verwenden, werden unter demselben Problem zusammengefasst. Die im userInfo Objekt enthaltenen Daten werden in Schlüssel-Wert-Paare konvertiert und im Abschnitt Schlüssel / Protokolle innerhalb eines einzelnen Problems angezeigt.

Warnung: Vermeiden Sie die Verwendung eindeutiger Werte wie Benutzer-ID, Produkt-ID und Zeitstempel in den Feldern Domäne und Code. Die Verwendung eindeutiger Werte in diesen Feldern führt zu einer hohen Kardinalität von Problemen und kann dazu führen, dass Crashlytics die Meldung protokollierter Fehler in Ihrer App einschränken muss. Stattdessen sollten dem userInfo Wörterbuchobjekt eindeutige Werte hinzugefügt werden.

Protokolle und benutzerdefinierte Schlüssel

Genau wie bei NSError können Sie Protokolle und benutzerdefinierte Schlüssel einbetten, um dem NSError Kontext NSError . Es gibt jedoch einen Unterschied zwischen den Protokollen, die an Abstürze angehängt sind, und den protokollierten Fehlern. Wenn ein Absturz auftritt und die App neu gestartet wird, sind die Protokolle, die Crashlytics von der Festplatte abruft, diejenigen, die bis zum Zeitpunkt des Absturzes geschrieben wurden. Wenn Sie einen NSError , wird die App nicht sofort beendet. Da Crashlytics den protokollierten Fehlerbericht nur beim nächsten App-Start sendet und den für Protokolle auf der Festplatte zugewiesenen Speicherplatz begrenzen muss, ist es möglich, nach der NSError eines NSError genügend Protokoll zu NSError , sodass alle relevanten Protokolle zum Zeitpunkt des Versands von Crashlytics ausgeschaltet werden der Bericht vom Gerät. NSErrors Sie dieses Gleichgewicht, wenn Sie NSErrors protokollieren und Protokolle und benutzerdefinierte Schlüssel in Ihrer App verwenden.

Leistungsüberlegungen

NSError Sie, dass das Protokollieren eines NSError ziemlich teuer sein kann. Zum Zeitpunkt des Aufrufs erfasst Crashlytics den Aufrufstapel des aktuellen Threads mithilfe eines Prozesses, der als Abwickeln des Stapels bezeichnet wird. Dieser Prozess kann CPU- und E / A-intensiv sein, insbesondere bei Architekturen, die das Abwickeln von DWARF unterstützen (arm64 und x86). Nach Abschluss des Abwickelns werden die Informationen synchron auf die Festplatte geschrieben. Dies verhindert Datenverlust, wenn die nächste Zeile abstürzt.

Denken Sie daran, dass das Versenden dieses Aufrufs an eine andere Warteschlange den Kontext der aktuellen Stapelverfolgung verliert, obwohl es sicher ist, diese API in einem Hintergrundthread aufzurufen.

Was ist mit NSExceptions?

Crashlytics bietet keine Möglichkeit, NSException Instanzen direkt zu protokollieren und NSException . Im Allgemeinen sind die APIs Cocoa und Cocoa Touch nicht ausnahmesicher. Das bedeutet, dass die Verwendung von @catch sehr schwerwiegende unbeabsichtigte Nebenwirkungen in Ihrem Prozess haben kann, selbst wenn es mit äußerster Sorgfalt verwendet wird. Sie sollten niemals @catch Anweisungen in Ihrem Code verwenden. Weitere Informationen finden Sie in der Dokumentation von Apple zum Thema.

Passen Sie Stapelspuren an

Wenn Ihre App in einer nicht nativen Umgebung (wie C ++ oder Unity) ausgeführt wird, können Sie mithilfe der Ausnahmemodell-API Absturzmetadaten im nativen Ausnahmeformat Ihrer App melden. Gemeldete Ausnahmen sind als fettfrei gekennzeichnet.

Schnell

 var  ex = ExceptionModel.init(name:"FooException", reason:"There was a foo.")
ex.stackTrace = [
  StackFrame.init(symbol:"makeError" fileName:"handler.js" lineNumber:495),
  StackFrame.init(symbol:"then" fileName:"routes.js" lineNumber:102),
  StackFrame.init(symbol:"main" fileName:"app.js" lineNumber:12),
]

crashlytics.record(exceptionModel:ex)
 

Ziel c

 FIRExceptionModel *model =
    [FIRExceptionModel exceptionModelWithName:@"FooException" reason:@"There was a foo."];
model.stackTrace = @[
  [FIRStackFrame stackFrameWithSymbol:@"makeError" fileName:@"handler.js" lineNumber:495],
  [FIRStackFrame stackFrameWithSymbol:@"then" fileName:@"routes.js" lineNumber:102],
  [FIRStackFrame stackFrameWithSymbol:@"main" fileName:@"app.js" lineNumber:12],
];
 

Aktivieren Sie die Opt-In-Berichterstellung

Standardmäßig sammelt Crashlytics automatisch Absturzberichte für alle Benutzer Ihrer App. Um Benutzern mehr Kontrolle über die von ihnen gesendeten Daten zu geben, können Sie die Opt-In-Berichterstellung für Ihre Benutzer aktivieren, indem Sie die automatische Erfassung deaktivieren und Crashlytics nur für ausgewählte Benutzer initialisieren:

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

    • Schlüssel: FirebaseCrashlyticsCollectionEnabled
    • Wert: false
  2. Aktivieren Sie die Erfassung für ausgewählte Benutzer, indem Sie zur Laufzeit die Überschreibung der Crashlytics-Datenerfassung aufrufen. Der Überschreibungswert bleibt bei allen Starts Ihrer App erhalten, sodass Crashlytics automatisch Berichte erfassen kann. Übergeben Sie false als Überschreibungswert, um die automatische Absturzberichterstattung zu deaktivieren. Bei der Einstellung false wird der neue Wert erst beim nächsten Ausführen der App angewendet.

    Schnell
    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
    Ziel c
    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

Verwalten von Crash Insights-Daten

Crash Insights hilft Ihnen bei der Lösung von Problemen, indem Sie Ihre anonymisierten Stack-Traces mit den Traces anderer Firebase-Apps vergleichen und Sie wissen lassen, ob Ihr Problem Teil eines größeren Trends ist. Für viele Probleme bietet Crash Insights sogar Ressourcen, mit denen Sie den Absturz beheben können.

Crash Insights verwendet aggregierte Crash-Daten, um allgemeine Stabilitätstrends zu identifizieren. Wenn Sie die Daten Ihrer App nicht freigeben möchten, können Sie Crash Insights im Menü Crash Insights oben in Ihrer Crashlytics-Problemliste in der Firebase-Konsole deaktivieren.