Skip to main content
Suivez cette procédure pour capturer les plantages natifs et les blocages du thread principal dans une application iOS. La capture des blocages nécessite UIKit. Importez le dSYM correspondant pour afficher l’emplacement dans le code source de chaque frame de pile. L’application enregistre un rapport local quand elle plante. À un lancement ultérieur, votre application lance le rejeu pour envoyer les preuves du plantage à LogBrew. LogBrew n’envoie pas le rapport Apple brut.
Utilisez LogBrew Swift 0.1.6 ou plus récent. Utilisez la CLI LogBrew native 0.1.24 ou plus récente pour importer les artefacts de débogage.
Dans l’application, utilisez une configuration d’ingestion limitée au projet. Utilisez une connexion au compte pour importer les artefacts et lire les problèmes. Une clé d’artefact de projet peut aussi servir à importer depuis une machine de build. N’incluez jamais de jeton d’accès au compte ni de clé d’artefact dans l’application.

Définir les limites de la capture

Vérifiez quand votre application peut rejouer chaque type de défaillance. Définissez la valeur de version avant le build. Elle doit identifier la version et le build de l’application. Utilisez la même valeur dans le SDK, l’import du dSYM et le filtre des problèmes. N’ajoutez pas de données utilisateur, de corps de requête ni d’en-têtes aux métadonnées de plantage.

Ajouter le produit de capture des plantages

Commencez par configurer la télémétrie du SDK pour votre application. Le rejeu utilise ce client et ce transport. Ajoutez le SDK public avec Swift Package Manager.
Ajoutez le produit LogBrew pour envoyer la télémétrie. N’ajoutez LogBrewCrash que si l’application active explicitement la capture native des plantages ou des blocages. L’intégration de capture prend en charge iOS 15 ou plus récent. Gardez un seul objet de capture, détenu par l’application, car les gestionnaires natifs d’erreurs fatales s’appliquent à tout le processus.

Configurer une identité exacte

Utilisez le même projet, la même version, le même environnement et le même service dans la configuration d’exécution et dans l’import des artefacts. LogBrew ne déduit pas et ne remplace pas ces valeurs.
Installez l’objet de capture sur le thread principal avant de créer l’interface racine. Créez d’abord son dossier parent. Gardez le dossier de stockage privé et détenu par l’application. L’objet de capture enregistre les exceptions Mach, les signaux POSIX, les exceptions C++ et les exceptions Objective-C. Le rapport local n’inclut ni le contenu de la mémoire, ni les noms des files d’attente, ni les logs de la console. Le rapport de plantage local peut contenir des détails sensibles sur l’application et l’appareil. Gardez-le hors des sauvegardes cloud et des dossiers partagés. LogBrew envoie les UUID des frames, les architectures et les décalages au lieu du rapport brut. NativeCrashConfiguration a deux limites facultatives : Une valeur hors de sa plage fait échouer la configuration avec crash_invalid_configuration.

Activer la capture des blocages

La capture des blocages est désactivée quand watchdog vaut nil. Pour l’activer, remplacez la déclaration de watchdog ci-dessus avant d’appeler install() :
Le seuil est en secondes, de 1 à 30. La capture des blocages nécessite aussi artifactIdentity. Sans elle, la configuration échoue avec crash_invalid_configuration. Gardez un seul objet crashCapture pendant toute la durée de vie du processus. Un second objet de capture ne peut pas s’installer. Son appel à install() échoue avec crash_capture_owned. Pour changer le seuil, utilisez la nouvelle valeur au prochain lancement de l’application. Un blocage terminé est rejoué avec crash.handled à true. Un blocage encore en cours au moment de l’arrêt du processus est rejoué avec crash.handled à false. Les deux formes incluent la métadonnée numérique durationMs. Elles gardent la même identité d’artefact que les frames des plantages fatals. Le watchdog se met en pause quand l’application est inactive ou sous un débogueur. Il suspend aussi la capture en cas de forte pression thermique. Un seuil court peut signaler comme blocages des traitements normaux du thread principal. Testez le seuil avec la configuration de build que vous livrez. L’état géré décrit la reprise. Il ne marque pas le problème comme résolu. Un blocage géré a quand même figé l’interface : examinez-le aussi.

Rejouer après le lancement

Après l’installation de la capture, rejouez les rapports en attente avec votre client SDK.
Votre application doit lancer le rejeu. La fin d’un blocage n’envoie aucun signal à elle seule. Appelez la même méthode après la fin du blocage ou au prochain lancement. Le rejeu traite les rapports valides du plus ancien au plus récent et garde leurs ID de signal stables. Un envoi échoué laisse son rapport en attente. Un envoi accepté le supprime. Le rejeu supprime les rapports qu’il ne peut pas lire et ceux qui dépassent maxReplayBytes. Vérifiez les trois nombres. Un nombre de rapports en attente égal à zéro ne prouve pas l’envoi à lui seul. Activez l’envoi durable avant le rejeu quand une requête échouée doit survivre à un autre redémarrage. N’appelez pas purge() pendant une reprise habituelle après un problème de réseau ou d’authentification.

Importer le dSYM correspondant

Archivez l’application avec les informations de débogage activées. Gardez le dSYM du build exact que les utilisateurs exécutent. Inspectez ses UUID d’image.
Validez l’artefact en local avant l’import.
Répétez --expect-image-uuid pour chaque architecture requise. La commande échoue quand l’ensemble des UUID trouvés diffère de l’ensemble attendu. Vérifiez l’accès au compte. Exécutez ensuite la même commande sans --dry-run.
La commande d’import valide les objets Apple pris en charge et vérifie chaque identité importée. Elle n’inclut ni chemin local ni nom de fichier dans les métadonnées de l’API. Le champ JSON status indique le résultat : Une machine de build peut importer avec une clé d’artefact de projet dans LOGBREW_TOKEN, au lieu de l’accès au compte. Créez la clé comme indiqué dans Créer une clé d’artefact. Cet import renvoie uploaded. Vérifiez ensuite chaque identité avec l’accès au compte :
status: "found" confirme l’artefact. status: "missing" signifie que LogBrew n’a aucun artefact pour cette identité. La résolution s’appuie sur l’UUID d’image et sur l’identité complète de l’artefact, pas sur le nom du fichier source. Un nouveau build du même code source peut avoir des UUID différents. Importez le bundle dSYM exact, pas un dossier de build entier.

Vérifier la lecture depuis LogBrew

Filtrez la liste des problèmes avec le même périmètre d’exécution. Cet exemple sélectionne les problèmes unresolved. Un problème résolu ou archivé n’apparaît pas.
La réponse de la liste identifie le problème groupé. Lisez son détail pour demander la résolution des frames par LogBrew.
Un artefact correspondant ajoute un objet symbolication. Cet exemple montre une sélection de champs d’un problème avec un frame résolu, pas la réponse complète.

Lire les preuves du plantage

Chaque frame a son propre status. Le champ symbolication.status utilise les mêmes valeurs : Notez un frame non résolu comme non résolu. Ne le présentez pas comme une pile vide. LogBrew résout les frames quand vous lisez le problème. Un dSYM importé plus tard peut résoudre les frames d’un signal plus ancien. Il ne peut pas ajouter des frames que le signal n’a pas capturés. Un frame applicatif réduit la recherche dans le code, mais il ne prouve pas la cause. Pour les Breadcrumbs, la chaîne d’exceptions et les preuves de trace, lisez l’investigation du problème :
Dans cette réponse, un frame avec source: "symbolicated" provient d’un artefact importé. Un frame avec source: "captured" est l’emplacement envoyé par l’application. Consultez Investiguer un problème pour les champs de la réponse. Gardez le périmètre complet (projet, version, environnement et service) à chaque lecture. N’étendez pas une recherche échouée à d’autres projets.

Vérifier la configuration de production

Utilisez une défaillance de test approuvée dans le build déployé. N’utilisez jamais l’action d’un client comme déclencheur. Vérifiez chaque point dans l’ordre et arrêtez-vous au premier échec :
  1. L’identité d’exécution correspond à l’identité de l’artefact importé.
  2. Un lancement ultérieur rejoue un signal confirmé, avec zéro rapport supprimé et zéro rapport en attente.
  3. La liste des problèmes filtrée renvoie le problème de test avec l’état géré attendu.
  4. Le frame applicatif attendu est résolu.
  5. Un lancement normal ultérieur n’ajoute pas d’autre occurrence.

Corriger sans risque

Pour investiguer un problème avec l’API dans le cas général, consultez Investiguer un problème.