Auf dieser Seite finden Sie Hilfe zur Fehlerbehebung und Antworten auf häufig gestellte Fragen zur Verwendung von Crashlytics. Wenn Sie das Gesuchte nicht finden oder weitere Unterstützung benötigen, wenden Sie sich an den Firebase-Support.
Allgemeine Fehlerbehebung/FAQs
Für einige Probleme in der Tabelle Probleme werden unterschiedliche Formate (und manchmal „Varianten“) angezeigt.
In der Tabelle Probleme in der Firebase Console werden möglicherweise zwei verschiedene Formate für Probleme aufgeführt. Außerdem sehen Sie bei einigen Problemen möglicherweise die Funktion „Varianten“. Hier ist der Grund dafür:
Anfang 2023 haben wir eine verbesserte Analyse-Engine zur Gruppierung von Ereignissen eingeführt. Außerdem haben wir das Design aktualisiert und einige erweiterte Funktionen für neue Probleme hinzugefügt, z. B. Varianten. Alle Details findest du in unserem aktuellen Blogpost. Im Folgenden findest du die wichtigsten Informationen.
Crashlytics analysiert alle Ereignisse in Ihrer App (z. B. Abstürze, nicht fatale Fehler und ANRs) und erstellt Ereignisgruppen, die als Probleme bezeichnet werden. Alle Ereignisse in einem Problem haben einen gemeinsamen Point of Failure.
Um Ereignisse in diesen Problemen zu gruppieren, berücksichtigt die verbesserte Analyse-Engine jetzt viele Aspekte des Ereignisses, einschließlich der Frames im Stack-Trace, der Ausnahmemeldung, des Fehlercodes und anderer Plattform- oder Fehlertypmerkmale.
Innerhalb dieser Gruppe von Ereignissen können sich die Stacktraces, die zum Fehler führen, jedoch unterscheiden. Ein anderer Stacktrace kann eine andere Ursache bedeuten.
Um diesen möglichen Unterschied innerhalb eines Problems darzustellen, erstellen wir jetzt Varianten innerhalb von Problemen. Jede Variante ist eine Teilgruppe von Ereignissen in einem Problem, die denselben Point of Failure und einen ähnlichen Stacktrace haben. Mit Varianten können Sie Fehler in den häufigsten Stacktraces beheben und feststellen, ob ein Problem verschiedene Ursachen hat.
Diese Verbesserungen bringen folgende Vorteile:
Überarbeitete Metadaten in der Problemzeile Probleme in Ihrer App lassen sich jetzt leichter nachvollziehen und priorisieren.
Weniger doppelte Probleme Eine Änderung der Zeilennummer führt nicht zu einem neuen Problem.
Einfachere Fehlerbehebung bei komplexen Problemen mit verschiedenen Ursachen Mit Varianten können Sie die häufigsten Stacktraces in einem Problem beheben.
Aussagekräftigere Warnungen und Signale Ein neues Problem stellt tatsächlich einen neuen Fehler dar.
Leistungsstärkere Suche Jedes Problem enthält mehr suchbare Metadaten, z. B. den Ausnahmetyp und den Paketnamen.
So werden diese Verbesserungen eingeführt:
Wenn wir neue Ereignisse von Ihrer App erhalten, prüfen wir, ob sie zu einem vorhandenen Problem passen.
Wenn keine Übereinstimmung gefunden wird, wenden wir automatisch unseren intelligenteren Ereignisgruppierungsalgorithmus auf das Ereignis an und erstellen ein neues Problem mit dem überarbeiteten Metadatendesign.
Dies ist die erste große Änderung an unserer Ereignisgruppierung. Wenn du Feedback hast oder Probleme auftreten,
kannst du uns eine Meldung senden.
Messwerte für Sitzungen ohne Abstürze und/oder Geschwindigkeitswarnungen werden nicht angezeigt
Wenn Sie keine fehlerfreien Messwerte (z. B. fehlerfreie Nutzer und Sitzungen) und/oder Geschwindigkeitswarnungen sehen, verwenden Sie das
Crashlytics SDK 11.7.0 oder höher.
Navigationspfad-Logs werden nicht angezeigt
Wenn keine Brotkrummenprotokolle angezeigt werden, empfehlen wir Ihnen, in der Konfiguration Ihrer App nach Google Analytics zu suchen.
Sie müssen die folgenden Anforderungen erfüllen:
Unsymbolisierte Stack-Traces für Android-Apps im Crashlytics-Dashboard
Wenn Sie Unity IL2CPP verwenden und nicht symbolisierte Stack-Traces sehen, versuchen Sie Folgendes:
Sie benötigen Version 8.6.1 oder höher des Crashlytics Unity SDK.
Sie müssen den Befehl Firebase CLI crashlytics:symbols:upload eingerichtet und ausgeführt haben, um die Symboldatei zu generieren und hochzuladen.
Sie müssen diesen Befehl jedes Mal ausführen, wenn Sie einen Release-Build oder einen Build erstellen, für den Sie symbolische Stack-Traces in der Firebase-Konsole sehen möchten. Weitere Informationen finden Sie auf der Seite Lesbare Absturzberichte abrufen.
Kann Crashlytics mit Apps verwendet werden, die IL2CPP verwenden?
Ja, Crashlytics kann symbolische Stack-Traces für Ihre Apps anzeigen, die IL2CPP verwenden. Diese Funktion ist für Apps verfügbar, die auf Android- oder Apple-Plattformen veröffentlicht wurden. Gehen Sie dazu so vor:
Sie müssen Version 8.6.0 oder höher des Crashlytics Unity SDK verwenden.
Führen Sie die erforderlichen Aufgaben für Ihre Plattform aus:
Apps für die Apple-Plattform: Es sind keine besonderen Maßnahmen erforderlich. Bei Apps für Apple-Plattformen konfiguriert das Firebase Unity Editor-Plug-in Ihr Xcode-Projekt automatisch für den Upload von Symbolen.
Android-Apps: Sie müssen den Befehl Firebase CLI crashlytics:symbols:upload zum Generieren und Hochladen Ihrer Symboldatei eingerichtet und ausführen.
Sie müssen diesen Befehl jedes Mal ausführen, wenn Sie einen Release-Build oder einen Build erstellen, für den Sie symbolische Stack-Traces in der Firebase-Konsole sehen möchten. Weitere Informationen finden Sie auf der Seite Lesbare Absturzberichte abrufen.
Wie werden Nutzer ohne Abstürze berechnet?
Der Wert „Ohne Abstürze“ gibt den Prozentsatz der Nutzer an, die in einem bestimmten Zeitraum mit Ihrer App interagiert haben und keine Abstürze aufgetreten sind.
Hier ist die Formel zur Berechnung des Prozentsatzes der Nutzer ohne Abstürze. Die Eingabewerte werden von Google Analytics bereitgestellt.
CRASH_FREE_USERS_PERCENTAGE = 1 - (CRASHED_USERS / ALL_USERS) x 100
Wenn ein Absturz auftritt, sendet Google Analytics den Ereignistyp app_exception. CRASHED_USERS steht für die Anzahl der Nutzer, die mit diesem Ereignistyp verknüpft sind.
ALL_USERS entspricht der Gesamtzahl der Nutzer, die im ausgewählten Zeitraum mit Ihrer App interagiert haben. Den Zeitraum können Sie oben rechts im Dashboard für Crashlytics im Drop-down-Menü auswählen.
Der Prozentsatz der Nutzer ohne Abstürze ist eine Zusammenfassung über einen bestimmten Zeitraum, kein Durchschnitt.
Angenommen, Ihre App hat drei Nutzer: Nutzer A, Nutzer B und Nutzer C. In der folgenden Tabelle sehen Sie, welche Nutzer täglich mit Ihrer App interagiert haben und bei welchen dieser Nutzer es an diesem Tag zu einem Absturz gekommen ist:
Montag
Dienstag
Mittwoch
Nutzer, die mit Ihrer App interagiert haben
A, B, C
A, B, C
A, B
Nutzer, bei dem ein Absturz aufgetreten ist
C
B
A
Am Mittwoch beträgt der Prozentsatz der Nutzer ohne Abstürze 50% (1 von 2 Nutzern). Zwei Ihrer Nutzer haben am Mittwoch mit Ihrer App interagiert, aber nur bei einem von ihnen (Nutzer B) kam es zu keinen Abstürzen.
In den letzten zwei Tagen lag der Prozentsatz der Nutzer ohne Abstürze bei 33, 3% (1 von 3 Nutzern hatte keine Abstürze). Drei Ihrer Nutzer haben in den letzten zwei Tagen mit Ihrer App interagiert, aber nur bei einem von ihnen (Nutzer C) kam es zu keinen Abstürzen.
In den letzten drei Tagen lag der Prozentsatz der Nutzer ohne Abstürze bei 0% (0 von 3 Nutzern hatten keine Abstürze). Drei Ihrer Nutzer haben in den letzten drei Tagen mit Ihrer App interagiert, aber bei keinem von ihnen ist die App abgestürzt.
Der Wert für die Anzahl der Nutzer ohne Abstürze sollte nicht über verschiedene Zeiträume hinweg verglichen werden.
Die Wahrscheinlichkeit, dass ein einzelner Nutzer einen Absturz erleidet, steigt mit der Häufigkeit, mit der er Ihre App verwendet. Daher ist der Wert für die Anzahl der Nutzer ohne Abstürze bei längeren Zeiträumen wahrscheinlich geringer.
Wer kann Notizen zu einem Problem aufrufen, erstellen und löschen?
Mit Notizen können Projektmitglieder bestimmte Probleme mit Fragen, Statusaktualisierungen usw. kommentieren.
Wenn ein Projektmitglied eine Notiz postet, wird sie mit der E-Mail-Adresse seines Google-Kontos gekennzeichnet. Diese E-Mail-Adresse ist zusammen mit der Notiz für alle Projektmitglieder sichtbar, die Zugriff darauf haben.
Im Folgenden wird der Zugriff beschrieben, der zum Ansehen, Schreiben und Löschen von Notizen erforderlich ist:
Projektmitglieder mit einer der folgenden Rollen können vorhandene Notizen ansehen und löschen sowie neue Notizen zu einem Problem erstellen.
Wer kann Notizen zu einem Problem aufrufen, erstellen und löschen?
Mit Notizen können Projektmitglieder bestimmte Probleme mit Fragen, Statusaktualisierungen usw. kommentieren.
Wenn ein Projektmitglied eine Notiz postet, wird sie mit der E-Mail-Adresse seines Google-Kontos gekennzeichnet. Diese E-Mail-Adresse ist zusammen mit der Notiz für alle Projektmitglieder sichtbar, die Zugriff darauf haben.
Im Folgenden wird der Zugriff beschrieben, der zum Ansehen, Schreiben und Löschen von Notizen erforderlich ist:
Projektmitglieder mit einer der folgenden Rollen können vorhandene Notizen ansehen und löschen sowie neue Notizen zu einem Problem erstellen.
Die App verwendet auch das Google Mobile Ads-SDK, aber es kommt nicht zu Abstürzen.
Wenn in Ihrem Projekt Crashlytics zusammen mit dem Google Mobile Ads SDK verwendet wird, stören die Absturzmelder wahrscheinlich die Registrierung von Ausnahmebehandlungen. Deaktiviere dazu die Absturzberichte im Mobile Ads SDK, indem du disableSDKCrashReporting aufrufst.
Wo befindet sich mein BigQuery-Dataset?
Nachdem Sie Crashlytics mit BigQuery verknüpft haben, werden neue Datasets, die Sie erstellen, automatisch in den USA gespeichert, unabhängig vom Standort Ihres Firebase-Projekts.
Wieder auftretende Probleme
Was ist ein regressiertes Problem?
Ein Problem ist wieder aufgetreten, nachdem du es zuvor geschlossen hast. Crashlytics erhält jedoch eine neue Meldung, dass das Problem wieder aufgetreten ist.
Crashlytics öffnet diese wiederkehrenden Probleme automatisch wieder, damit Sie sie entsprechend Ihrer App beheben können.
Im folgenden Beispiel wird erläutert, wie Crashlytics ein Problem als Regression kategorisiert:
Zum ersten Mal erhält Crashlytics einen Absturzbericht zu „Absturz A“. Crashlytics öffnet ein entsprechendes Problem für diesen Absturz (Problem „A“).
Sie beheben diesen Fehler schnell, schließen das Problem „A“ und veröffentlichen dann eine neue Version Ihrer App.
Crashlytics erhält eine weitere Meldung zu Problem A, nachdem Sie das Problem geschlossen haben.
Wenn der Bericht von einer App-Version stammt, die Crashlyticsbekannt war, als Sie das Problem geschlossen haben (d. h., für die Version wurde ein Absturzbericht für einen beliebigen Absturz gesendet), wird das Problem von Crashlytics nicht als wieder aufgetreten eingestuft. Das Problem bleibt geschlossen.
Wenn der Bericht von einer App-Version stammt, von der Crashlyticsnicht wusste, als Sie das Problem geschlossen haben (d. h., für die Version wurde nie ein Absturzbericht gesendet), betrachtet Crashlytics das Problem als wieder aufgetreten und öffnet es noch einmal.
Wenn ein Problem wieder auftritt, senden wir eine Benachrichtigung zur Regressionserkennung und fügen dem Problem ein Regressionssignal hinzu, um Sie darüber zu informieren, dass Crashlytics das Problem wieder geöffnet hat. Wenn Sie nicht möchten, dass ein Problem aufgrund unseres Regressionsalgorithmus wieder geöffnet wird, können Sie es stummschalten, anstatt es zu schließen.
Warum treten bei älteren App-Versionen wieder Probleme auf?
Wenn ein Bericht von einer alten App-Version stammt, von der zu dem Zeitpunkt, als Sie das Problem geschlossen haben, noch keine Absturzberichte gesendet wurden, betrachtet Crashlytics das Problem als wieder aufgetreten und öffnet es noch einmal.
Das kann in folgenden Fällen passieren: Sie haben einen Fehler behoben und eine neue Version Ihrer App veröffentlicht, aber es gibt immer noch Nutzer, die ältere Versionen ohne Fehlerbehebung verwenden. Wenn bei einer dieser älteren Versionen nie Absturzberichte gesendet wurden, als Sie das Problem geschlossen haben, und diese Nutzer den Fehler dann wieder sehen, lösen diese Absturzberichte ein wiederaufgetretenes Problem aus.
Wenn Sie nicht möchten, dass ein Problem aufgrund unseres Regressionsalgorithmus wieder geöffnet wird, können Sie es stummschalten, anstatt es zu schließen.
Nicht erfasste Ausnahmen als schwerwiegende Ereignisse melden
Crashlytics kann nicht erfasste Ausnahmen als schwerwiegend melden (ab Version 10.4.0 des Unity SDK). In den folgenden FAQs werden die Hintergründe und Best Practices für die Verwendung dieser Funktion erläutert.
Warum sollten nicht erfasste Ausnahmen in einer App als schwerwiegend gemeldet werden?
Wenn Sie nicht erfasste Ausnahmen als schwerwiegend melden, erhalten Sie eine realistischere Angabe dazu, welche Ausnahmen dazu führen können, dass das Spiel nicht mehr spielbar ist – auch wenn die App weiter ausgeführt wird.
Wenn Sie schiefgelaufene Abläufe melden, sinkt der Prozentsatz der Nutzer ohne Abstürze wahrscheinlich. Der Messwert ist dann aber repräsentativer für die Nutzererfahrung mit Ihrer App.
Welche Ausnahmen werden als schwerwiegend gemeldet?
Damit Crashlytics eine nicht erfasste Ausnahme als schwerwiegend meldet, müssen beide der folgenden Bedingungen erfüllt sein:
Ihre App (oder eine darin enthaltene Bibliothek) wirft eine Ausnahme, die nicht abgefangen wird. Eine Ausnahme, die erstellt, aber nicht ausgelöst wird, gilt nicht als nicht abgefangen.
Nachdem ich die Meldung nicht erfasster Ausnahmen als schwerwiegende Ereignisse aktiviert habe, habe ich jetzt viele neue schwerwiegende Fehler. Wie gehe ich mit diesen Ausnahmen richtig um?
Wenn Sie Berichte zu nicht abgefangenen Ausnahmen als fatale Fehler erhalten, haben Sie folgende Möglichkeiten, mit diesen Ausnahmen umzugehen:
Ausnahmen werden erstellt und geworfen, um unerwartete oder außergewöhnliche Zustände widerzuspiegeln.
Um die durch eine geworfene Ausnahme verursachten Probleme zu beheben, muss das Programm in einen bekannten Zustand zurückversetzt werden. Dieser Vorgang wird als Ausnahmebehandlung bezeichnet.
Es wird empfohlen, alle vorhersehbaren Ausnahmen abzufangen und zu behandeln, es sei denn, das Programm kann nicht in einen bekannten Zustand zurückversetzt werden.
Ausnahmen in Unity oder Crashlytics protokollieren
Es gibt mehrere Möglichkeiten, Ausnahmen in Unity oder Crashlytics zu erfassen, um das Problem zu beheben.
Bei der Verwendung von Crashlytics gibt es zwei gängige und empfohlene Optionen:
Option 1: Während der Entwicklung oder Fehlerbehebung in der Unity-Konsole drucken, aber nicht an Crashlytics senden
Mit Debug.Log(exception), Debug.LogWarning(exception) und Debug.LogError(exception) können Sie den Inhalt der Ausnahme in die Unity-Konsole drucken und die Ausnahme nicht noch einmal werfen.
Option 2: In folgenden Fällen können Sie Daten in Crashlytics hochladen, um konsolidierte Berichte im Crashlytics-Dashboard zu erhalten:
Wenn eine Ausnahme protokolliert werden sollte, um ein mögliches nachfolgendes Crashlytics-Ereignis zu beheben, verwenden Sie Crashlytics.Log(exception.ToString()).
Wenn eine Ausnahme trotz Auffangen und Beheben an Crashlytics gemeldet werden soll, verwenden Sie Crashlytics.LogException(exception), um sie als nicht kritisches Ereignis zu protokollieren.
Wenn Sie ein fatales Ereignis jedoch manuell in Unity Cloud Diagnostics melden möchten, können Sie Debug.LogException verwenden. Bei dieser Option wird die Ausnahme wie bei Option 1 in die Unity-Konsole ausgegeben, aber auch ausgelöst (unabhängig davon, ob sie bereits ausgelöst oder abgefangen wurde). Der Fehler wird nicht lokal ausgelöst. Das bedeutet, dass selbst ein umschließender Debug.LogException(exception)-Block mit try-catch-Blöcken zu einer nicht abgefangenen Ausnahme führt.
Rufen Sie Debug.LogException daher nur auf, wenn Sie alle der folgenden Aktionen ausführen möchten:
Die Ausnahme in der Unity-Konsole ausgeben.
Sie können die Ausnahme als schwerwiegendes Ereignis in Crashlytics hochladen.
Damit die Ausnahme ausgelöst wird, muss sie als nicht erfasste Ausnahme behandelt und an Unity Cloud Diagnostics gemeldet werden.
Wenn Sie eine erfasste Ausnahme in der Unity-Konsole ausgeben und als nicht kritisches Ereignis in Crashlytics hochladen möchten, gehen Sie stattdessen so vor:
try{methodThatThrowsMyCustomExceptionType();}catch(MyCustomExceptionTypeexception){// Print the exception to the Unity console at the error level.Debug.LogError(exception);// Upload the exception to Crashlytics as a non-fatal event.Crashlytics.LogException(exception);// not Debug.LogException//// Code that handles the exception//}