Personnaliser vos rapports d'erreur Firebase Crashlytics


Dans le tableau de bord Crashlytics, vous pouvez cliquer sur un problème pour obtenir le rapport sur les événements. Vous pouvez personnaliser ces rapports afin de mieux comprendre ce qui se passe dans votre application et les circonstances liées aux événements signalés Crashlytics

  • Obtenez automatiquement des journaux de fil d'Ariane si votre application utilise le SDK Firebase pour Google Analytics. Ces journaux vous donnent une visibilité actions des utilisateurs menant à un événement collecté par Crashlytics dans votre application.

  • Désactivez l'envoi automatique de rapports d'erreur et activer la création de rapports pour vos utilisateurs. Notez que, par par défaut, Crashlytics collecte automatiquement les rapports d'erreur les utilisateurs de votre application.

Ajouter des clés personnalisées

Les clés personnalisées vous permettent de connaître l'état spécifique de votre application pouvant entraîner un plantage. Vous pouvez associer des paires clé/valeur arbitraires à vos rapports d'erreur, puis utiliser les clés personnalisées pour rechercher et filtrer les rapports d'erreur dans la console Firebase.

  • Vous pouvez rechercher des problèmes dans le tableau de bord Crashlytics. correspondant à une clé personnalisée.
  • Lorsque vous examinez un problème spécifique dans la console, vous pouvez afficher les clés personnalisées associées à chaque événement (sous-onglet Clés) et même filtrer les événements par clés personnalisées (menu Filtrer en haut de la page).

Utilisez la méthode setCustomValue pour définir des paires clé/valeur. Exemple :

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

Lorsque vous définissez des entiers, des valeurs booléennes ou des nombres à virgule flottante, encadrez la valeur avec @(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"];

Vous pouvez également modifier la valeur d'une clé existante en appelant la touche et en définissant à une valeur différente. Exemple :

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"];

Ajoutez des paires clé-valeur de manière groupée à l'aide de la méthode setCustomKeysAndValues avec un NSDictionary comme seul paramètre :

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];

Ajouter des messages de journal personnalisés

Pour obtenir plus de contexte sur les événements qui ont conduit à un plantage, vous pouvez ajouter des journaux Crashlytics personnalisés à votre application. Crashlytics associe les journaux à vos données de plantage et les affiche sur la page Crashlytics de la console Firebase, sous l'onglet Journaux.

Swift

Utilisez log() ou log(format:, arguments:) pour identifier les problèmes. Si vous vous souhaitez obtenir une sortie de journal utile avec des messages, c'est-à-dire l'objet que vous transmettez à log() doit être conforme aux CustomStringConvertible . log() renvoie la propriété de description que vous définissez pour l'objet. Exemple :

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

Valeurs de format .log(format:, arguments:) renvoyées par l'appel getVaList() Exemple :

Crashlytics.crashlytics().log(format: "%@, %@", arguments: getVaList(["Higgs-Boson detected! Bailing out…", attributesDict]))

Pour en savoir plus sur l'utilisation de log() ou log(format:, arguments:), consultez la documentation de référence sur Crashlytics.

Objective-C

Utilisez log ou logWithFormat pour identifier les problèmes. Notez que si vous souhaitez obtenir une sortie de journal utile avec des messages, l'objet que vous transmettez à l'une des méthodes doit remplacer la propriété d'instance description. Exemple :

[[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];

Pour en savoir plus sur l'utilisation de log et logWithFormat, consultez la documentation de référence sur Crashlytics.

Définir des identifiants utilisateur

Pour diagnostiquer un problème, il est souvent utile de savoir lesquels de vos utilisateurs ont rencontré lors d'un plantage donné. Crashlytics permet d'identifier anonymement les utilisateurs dans vos rapports d'erreur.

Pour ajouter des ID utilisateur à vos rapports, attribuez à chaque utilisateur un identifiant unique sous la forme d'un numéro d'ID, d'un jeton ou d'une valeur hachée :

Swift

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

Objective-C

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

Si vous devez effacer un identifiant utilisateur après l'avoir défini, réinitialisez la valeur une chaîne vide. Effacer un ID utilisateur ne supprime pas les enregistrements Crashlytics existants. Si vous devez supprimer les enregistrements associés à un utilisateur contactez l'assistance Firebase.

Signaler des exceptions non fatales

En plus de signaler automatiquement les plantages de votre application, Crashlytics permet vous enregistrez des exceptions non fatales et vous les enverrez la prochaine fois que votre application lancements.

Vous pouvez enregistrer des exceptions non fatales en enregistrant des objets NSError avec la méthode recordError. recordError capture la pile d'appel du thread en appelant [NSThread callStackReturnAddresses]

Swift

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

Objective-C

[[FIRCrashlytics crashlytics] recordError:error];

Lorsque vous utilisez la méthode recordError, il est important de comprendre la structure NSError et la façon dont Crashlytics utilise les données pour regrouper les plantages. Incorrecte l'utilisation de la méthode recordError peut entraîner un comportement imprévisible et peut Crashlytics limite la création de rapports sur les erreurs consignées pour votre application.

Un objet NSError comporte trois arguments :

  • domain: String
  • code: Int
  • userInfo: [AnyHashable : Any]? = nil

Contrairement aux plantages fatals, qui sont regroupés via une analyse de la trace de la pile, les erreurs consignées sont regroupées par domain et code. Il s'agit d'une distinction importante entre les plantages fatals et les erreurs journalisées. Exemple :

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];

Lorsque vous consignez l'erreur ci-dessus, cela crée un nouveau problème regroupé par NSSomeErrorDomain et -1001. Les erreurs consignées supplémentaires qui utilisent la même les valeurs du domaine et du code sont regroupées sous le même problème. Les données contenues dans l'objet userInfo sont converties en paires clé-valeur et affichées dans la section "clés/journaux" d'un problème spécifique.

Journaux et clés personnalisées

Tout comme les rapports d'erreur, vous pouvez intégrer des journaux et des clés personnalisées pour ajouter du contexte à la NSError. Toutefois, les journaux associés aux plantages ne sont pas les mêmes que ceux associés aux erreurs journalisées. Lorsqu'un plantage se produit et que l'application est redémarrée, les journaux que Crashlytics récupère sur le disque sont ceux qui ont été écrits jusqu'à l'heure du plantage. Lorsque vous consignez un NSError, l'application ne prend pas immédiatement en compte mettre fin. Étant donné que Crashlytics n'envoie le rapport d'erreur enregistré qu'au prochain lancement de l'application et qu'il doit limiter l'espace alloué aux journaux sur le disque, il est possible de consigner suffisamment de journaux après l'enregistrement d'un NSError afin que tous les journaux pertinents soient remplacés au moment où Crashlytics envoie le rapport depuis l'appareil. Gardez cet équilibre à l'esprit lorsque vous consignez NSErrors et que vous utilisez des journaux et des clés personnalisées dans votre application.

Considérations sur les performances

N'oubliez pas que la journalisation d'un NSError peut être assez coûteuse. Au moment de l'appel, Crashlytics capture la pile d'appels du thread actuel à l'aide d'un processus appelé "déroulement de la pile". Ce processus peut utiliser beaucoup de ressources processeur et d'E/S, en particulier sur les architectures compatibles avec le dévidage DWARF (arm64 et x86). Une fois le déroulement terminé, les informations sont écrites sur le disque de manière synchrone. Cela évite la perte de données si la ligne suivante devait planter.

Bien qu'il soit possible d'appeler cette API sur un thread en arrière-plan, n'oubliez pas que si vous envoyez cet appel perd le contexte de la trace de la pile actuelle.

Qu'en est-il des NSExceptions ?

Crashlytics n'offre pas de fonctionnalité permettant de journaliser et d'enregistrer directement des instances NSException. De manière générale, les API Cocoa et Cocoa Touch ne sont pas sécurisées contre les exceptions. Cela signifie que l'utilisation de @catch peut avoir des effets involontaires très graves effets secondaires dans votre processus, même lorsqu'il est utilisé avec un soin extrême. Vous ne devez jamais Utilisez des instructions @catch dans votre code. Veuillez consulter la documentation Apple sur ce sujet.

Personnaliser les traces de pile

Si votre application s'exécute dans un environnement non natif (tel que C++ ou Unity), vous pouvez utiliser API Exception Model pour signaler les métadonnées de plantage dans l'exception native de votre application . Les exceptions signalées sont marquées comme non fatales.

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];

Les frames de pile personnalisés peuvent également être initialisés avec des adresses uniquement :

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];

Obtenir les journaux des fils d'Ariane

Les journaux de breadcrumb vous permettent de mieux comprendre les interactions d'un utilisateur avec votre application avant un plantage, un problème non fatal ou un événement ANR. Ces journaux peuvent être utile lorsque vous essayez de reproduire et de déboguer un problème.

Les journaux de fil d'Ariane étant fournis par Google Analytics, vous devez besoin de activer Google Analytics pour votre projet Firebase ajouter le SDK Firebase pour Google Analytics à votre application. Une fois ces conditions remplies, les journaux de fil d'Ariane sont automatiquement incluses dans les données d'un événement dans l'onglet Journaux lorsque vous affichez les détails d'un problème.

SDK Analytics enregistre automatiquement l'événement screen_view ce qui permet aux journaux du fil d'Ariane d'afficher la liste des écrans vus avant le plantage, non fatal ou ANR. Un journal de fil d'Ariane screen_view contient un paramètre firebase_screen_class.

Les journaux de fil d'Ariane sont également renseignés par tous les événements personnalisés que vous enregistrez manuellement dans la session de l'utilisateur, y compris les données de paramètre de l'événement. Ces données peuvent aider à afficher une série d'actions utilisateur ayant conduit à un plantage, un problème non fatal ou un événement ANR.

Notez que vous pouvez contrôler la collecte et l'utilisation des données Google Analytics, qui inclut les données qui renseignent les journaux de fil d'Ariane.

Activer les rapports nécessitant une confirmation

Par défaut, Crashlytics collecte automatiquement les rapports d'erreur pour tous les utilisateurs de votre application. Pour permettre aux utilisateurs de mieux contrôler les données qu'ils envoient, vous pouvez activer activer la création de rapports en désactivant la création automatique de rapports et en n'envoyant des données qu'à Crashlytics lorsque vous le choisissez dans votre code:

  1. Désactivez la collecte automatique en ajoutant une clé à votre fichier Info.plist:

    • Clé : FirebaseCrashlyticsCollectionEnabled
    • Valeur : false
  2. Activez la collecte pour certains utilisateurs en appelant les données Crashlytics un remplacement de collection au moment de l'exécution. La valeur de remplacement persiste de votre application afin que Crashlytics puisse collecter automatiquement des rapports.

    Pour désactiver la création automatique de rapports d'erreur, transmettez false comme valeur de remplacement. Lorsque cette valeur est définie sur false, la nouvelle valeur ne s'applique qu'à l'exécution suivante de l'application.

    Swift

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)

    Objective-C

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

Gérer les données Crash Insights

Les insights sur les plantages vous aident à résoudre les problèmes en comparant vos traces de pile anonymisées à celles d'autres applications Firebase, et en vous indiquant si votre problème fait partie d'une tendance plus large. Pour de nombreux problèmes, Crash Insights fournit même des ressources pour vous aider à déboguer le plantage.

Crash Insights utilise des données de plantage agrégées pour identifier les tendances de stabilité courantes. Si vous préférez ne pas partager les données de votre application, vous pouvez désactiver Crash Insights Dans le menu Crash Insights, en haut de la liste des problèmes Crashlytics dans la console Firebase.