Skip to main content
Mit diesem Ablauf erfassen Sie native Abstürze und Hänger des Main-Threads in einer iOS-App. Die Erfassung von Hängern braucht UIKit. Laden Sie das passende dSYM hoch, um Quellcode-Stellen in den Stackframes zu sehen. Bei einem Absturz speichert die App einen lokalen Bericht. Bei einem späteren Start ruft Ihre App Replay auf und sendet die Absturz-Belege an LogBrew. LogBrew sendet nicht den rohen Apple-Bericht.
Verwenden Sie LogBrew Swift 0.1.6 oder neuer. Verwenden Sie für das Hochladen von Debug-Artefakten die native LogBrew-CLI 0.1.24 oder neuer.
Verwenden Sie in der App eine Ingest-Konfiguration für das Projekt. Verwenden Sie für das Hochladen von Artefakten und das Lesen von Issues eine Kontoanmeldung. Ein Projekt-Artefaktschlüssel kann auch von einer Build-Maschine hochladen. Bauen Sie nie ein Konto-Zugriffstoken oder einen Artefaktschlüssel in die App ein.

Grenzen der Erfassung planen

Prüfen Sie, wann Ihre App jede Fehlerart per Replay senden kann. Legen Sie den Release-Wert vor dem Build fest. Er muss App-Version und Build eindeutig bezeichnen. Verwenden Sie denselben Wert im SDK, beim Hochladen des dSYM und im Issue-Filter. Hängen Sie keine Nutzerdaten, Anfrage-Bodys oder Header an die Absturz-Metadaten an.

Absturz-Produkt hinzufügen

Richten Sie zuerst die SDK-Telemetrie für Ihre App ein. Replay nutzt diesen client und diesen transport. Fügen Sie das öffentliche SDK über den Swift Package Manager hinzu.
Fügen Sie das Produkt LogBrew hinzu, um Telemetrie zu senden. Fügen Sie LogBrewCrash nur hinzu, wenn die App die Erfassung nativer Abstürze oder Hänger ausdrücklich aktiviert. Die Erfassung unterstützt iOS 15 oder neuer. Behalten Sie genau ein Erfassungsobjekt, das der App gehört, denn native Handler für fatale Fehler gelten für den ganzen Prozess.

Eine exakte Identität konfigurieren

Verwenden Sie dasselbe Projekt, dasselbe Release, dieselbe Umgebung und denselben Dienst in der Laufzeit-Einrichtung und beim Hochladen der Artefakte. LogBrew leitet diese Werte nicht ab und ersetzt sie nicht.
Installieren Sie das Erfassungsobjekt auf dem Main-Thread, bevor Sie die Root-UI erstellen. Legen Sie vorher sein übergeordnetes Verzeichnis an. Halten Sie das Speicherverzeichnis privat und im Besitz der App. Das Erfassungsobjekt zeichnet Mach-Exceptions, Signale, C++-Exceptions und Objective-C-Exceptions auf. Der lokale Bericht enthält keine Speicherinhalte, keine Queue-Namen und keine Konsolen-Logs. Der lokale Absturzbericht kann sensible Details zu App und Gerät enthalten. Halten Sie ihn aus Cloud-Backups und geteilten Verzeichnissen heraus. LogBrew sendet Frame-UUIDs, Architekturen und Offsets statt des rohen Berichts. NativeCrashConfiguration hat zwei optionale Grenzen: Ein Wert außerhalb seines Bereichs lässt die Konfiguration crash_invalid_configuration auslösen.

Erfassung von Hängern aktivieren

Die Erfassung von Hängern ist aus, wenn watchdog nil ist. Um sie zu aktivieren, ersetzen Sie die obige Deklaration von watchdog, bevor Sie install() aufrufen:
Der Schwellenwert ist in Sekunden angegeben, von 1 bis 30. Die Erfassung von Hängern braucht außerdem artifactIdentity. Ohne diesen Wert löst die Konfiguration crash_invalid_configuration aus. Behalten Sie ein crashCapture-Objekt für die gesamte Laufzeit des Prozesses. Ein zweites Erfassungsobjekt kann sich nicht installieren. Sein Aufruf von install() löst crash_capture_owned aus. Um den Schwellenwert zu ändern, verwenden Sie den neuen Wert beim nächsten App-Start. Ein überstandener Hänger wird mit crash.handled auf true per Replay gesendet. Ein laufender Hänger, den ein Beenden des Prozesses hinterlassen hat, wird mit crash.handled auf false gesendet. Beide Formen enthalten numerische Metadaten in durationMs. Sie behalten dieselbe Artefakt-Identität wie die Frames fataler Abstürze. Der Watchdog pausiert, solange die App inaktiv ist oder unter einem Debugger läuft. Bei starker thermischer Belastung unterdrückt er die Erfassung ebenfalls. Ein kurzer Schwellenwert kann normale Arbeit auf dem Main-Thread als Hänger melden. Testen Sie den Schwellenwert mit der Build-Konfiguration, die Sie ausliefern. Der behandelte Zustand beschreibt die Erholung. Er markiert das Issue nicht als gelöst. Ein behandelter Hänger hat die Oberfläche trotzdem blockiert. Prüfen Sie ihn also auch.

Replay nach dem Start

Senden Sie ausstehende Berichte nach der Installation der Erfassung per Replay über Ihren SDK-Client.
Ihre App muss Replay aufrufen. Die Erholung von einem Hänger allein sendet kein Ereignis. Rufen Sie dieselbe Methode nach der Erholung oder beim nächsten Start auf. Replay verarbeitet gültige Berichte vom ältesten zum neuesten und behält ihre stabilen Ereignis-IDs. Eine fehlgeschlagene Zustellung lässt den Bericht ausstehend. Eine angenommene Zustellung entfernt ihn. Replay verwirft Berichte, die es nicht lesen kann, und Berichte, die größer als maxReplayBytes sind. Prüfen Sie alle drei Zahlen. Eine Null bei den ausstehenden Berichten allein beweist keine Zustellung. Aktivieren Sie vor dem Replay die dauerhafte Zustellung, wenn eine fehlgeschlagene Anfrage einen weiteren Neustart überstehen muss. Rufen Sie purge() nicht bei einer gewöhnlichen Erholung von Netzwerk- oder Authentifizierungsfehlern auf.

Passendes dSYM hochladen

Archivieren Sie die App mit aktivierten Debug-Informationen. Behalten Sie das dSYM genau des Builds, den die Nutzer ausführen. Prüfen Sie seine Image-UUIDs.
Prüfen Sie das Artefakt vor dem Hochladen lokal.
Wiederholen Sie --expect-image-uuid für jede benötigte Architektur. Der Befehl schlägt fehl, wenn die gefundenen UUIDs von den erwarteten abweichen. Prüfen Sie den Kontozugriff. Führen Sie dann denselben Befehl ohne --dry-run aus.
Der Upload-Befehl prüft unterstützte Apple-Objekte und verifiziert jede hochgeladene Identität. Er nimmt keine lokalen Pfade oder Dateinamen in die API-Metadaten auf. Das JSON-Feld status zeigt das Ergebnis: Eine Build-Maschine kann statt mit Kontozugriff mit einem Projekt-Artefaktschlüssel in LOGBREW_TOKEN hochladen. Erstellen Sie den Schlüssel wie unter Artefaktschlüssel erstellen beschrieben. Dieser Upload meldet uploaded. Verifizieren Sie jede Identität später mit Kontozugriff:
status: "found" bestätigt das Artefakt. status: "missing" heißt, dass LogBrew für diese Identität kein Artefakt hat. Die Zuordnung prüft die Image-UUID und die vollständige Artefakt-Identität, nicht den Namen der Quelldatei. Ein neuer Build desselben Quellcodes kann andere UUIDs haben. Laden Sie genau das dSYM-Bundle hoch, nicht ein ganzes Build-Verzeichnis.

Gehostetes Ergebnis prüfen

Filtern Sie die Issue-Liste mit demselben Laufzeitbereich. Dieses Beispiel wählt Issues mit unresolved aus. Ein gelöstes oder archiviertes Issue erscheint nicht.
Die Antwort der Liste bezeichnet das gruppierte Issue. Lesen Sie seine Details, um die gehostete Frame-Zuordnung anzufordern.
Ein passendes Artefakt fügt ein symbolication-Objekt hinzu. Dieses Beispiel zeigt ausgewählte Felder eines Issues mit einem zugeordneten Frame, nicht die vollständige Antwort.

Absturz-Belege lesen

Jeder Frame hat einen eigenen status. Das Feld symbolication.status verwendet dieselben Werte: Notieren Sie einen nicht zugeordneten Frame als nicht zugeordnet. Melden Sie ihn nicht als leeren Stack. LogBrew ordnet Frames zu, wenn Sie das Issue lesen. Ein später hochgeladenes dSYM kann Frames eines früheren Ereignisses zuordnen. Es kann keine Frames hinzufügen, die das Ereignis nicht erfasst hat. Ein Anwendungsframe grenzt die Codesuche ein, beweist aber nicht die Ursache. Für vorherige Schritte, die Ausnahmekette und Trace-Belege lesen Sie die Untersuchung des Issues:
In dieser Antwort stammt ein Frame mit source: "symbolicated" aus einem hochgeladenen Artefakt. Ein Frame mit source: "captured" ist die Stelle, die die App gesendet hat. Die Antwortfelder finden Sie unter Issue untersuchen. Behalten Sie bei jedem Lesen den vollständigen Bereich aus Projekt, Release, Umgebung und Dienst bei. Weiten Sie eine fehlgeschlagene Suche nicht auf andere Projekte aus.

Einrichtung in Produktion prüfen

Verwenden Sie im bereitgestellten Build einen freigegebenen Testfehler. Lösen Sie ihn nie mit einer Kundenaktion aus. Prüfen Sie die Punkte der Reihe nach und halten Sie beim ersten Fehler an:
  1. Die Laufzeit-Identität passt zur Identität des hochgeladenen Artefakts.
  2. Ein späterer Start sendet per Replay ein bestätigtes Ereignis, mit null verworfenen und null ausstehenden Berichten.
  3. Die eingegrenzte Issue-Liste gibt das Test-Issue mit dem erwarteten behandelten Zustand zurück.
  4. Der erwartete Anwendungsframe wird zugeordnet.
  5. Ein späterer fehlerfreier Start fügt kein weiteres Vorkommen hinzu.

Sicher wiederherstellen

Für allgemeine Issue-Untersuchungen nutzen Sie Issue mit der API untersuchen.