Meilleures pratiques de journalisation des erreurs et / ou de rapports pour iPhone

Quand je fais du développement web, j'utilise un logger qui intercepte les erreurs fatales et ajoute une trace dans un fichier et affiche un message à l'utilisateur. Je peux parfois jeter un coup d'oeil pour voir si le fichier a changé, ce qui signifie que certains utilisateurs ont rencontré une erreur et je peux creuser pour voir ce qu'ils ont rencontré.

j'aimerais quelque chose de similaire sur l'iphone, avec quelques mises en garde:

  • en cours de développement, il devrait être trivial de réinitialiser la liste des les erreurs ou désactiver la notification.
  • pendant le développement, les messages d'erreur devraient également apparaître à un endroit évident, comme sur l'écran sur la console
  • une fois déployées, les erreurs doivent être envoyées poliment au vaisseau mère pour analyse (pour une correction de bogue dans la prochaine mise à jour)
  • activez la journalisation de Trace/Info lorsque vous tentez de dépister un problème pendant le développement
  • désactiver la journalisation de la console pour 'Release' afin d'accélérer les choses pour l'utilisateur
  • devrait nettoyer après lui-même afin d'être un bon citoyen au téléphone

Quelques Liens

il semble qu'il y ait une boîte à outils commune pour faire cela - comment gérer cela?

[Mise À Jour Octobre 2011] Il y a eu des évolutions, de maturité variable...

  • PLCrashReporter .
  • Quincy se trouve sur le dessus de la PLC.
  • Bugsense commercial crash reporter.
  • Crittercism crash et de rapports d'erreurs (certains programmes gratuits, d'autres payants).
  • test flight dispose maintenant d'un SDK qui saisit les accidents (mais pas encore pour app store App apps, juste dev apps).
  • Comme le Vol d'Essai, Hockey vise à combiner la distribution ad hoc avec des rapports d'incidents.
29
demandé sur Community 2009-11-03 18:22:50

4 réponses

Voici ce que nous faisons:

  • laisser l'iPhone gérer son propre crash dumps à travers le App Store mécanismes existants . Update : ayant constaté que iTunes Connect n'était pas fiable pour fournir des rapports d'accident, je recommande d'utiliser tissu/Crashlytics , ou un concurrent comme Crittercism ou Rollbar .
  • notre produit libéré n'a aucune trace dans, cela semble être compatible avec ce que la plupart des autres applications iPhone faire.
  • si un bogue est signalé alors nous le reproduisons en utilisant une construction tracée.

plus en détail:

  • nous définissons macros à NSLog trace à de nombreux niveaux différents de granularité.
  • utilise les paramètres de construction de Xcode pour changer le niveau de trace, qui contrôle combien de trace est compilé dans le produit, par exemple il y a des configurations de construction de Release et Debug.
  • si aucun niveau de trace n'est défini, alors nous montrons une trace complète dans le simulateur, et aucune trace lors de la course sur un appareil réel.

j'ai inclus le code d'exemple ci-dessous montrant comment nous avons écrit ceci, et à quoi ressemble la sortie.

nous définissons plusieurs niveaux de trace différents de sorte que les développeurs peuvent identifier quelles lignes de trace sont importantes, et peut filtrer les détails de niveau inférieur s'ils le veulent.

exemple de code:

- (void)myMethod:(NSObject *)xiObj
{
  TRC_ENTRY;
  TRC_DBG(@"Boring low level stuff");
  TRC_NRM(@"Higher level trace for more important info");
  TRC_ALT(@"Really important trace, something bad is happening");
  TRC_ERR(@"Error, this indicates a coding bug or unexpected condition");
  TRC_EXIT;
}

Exemple de sortie de trace:

2009-09-11 14:22:48.051 MyApp[3122:207] ENTRY:+[MyClass myMethod:]
2009-09-11 14:22:48.063 MyApp[3122:207] DEBUG:+[MyClass myMethod:]:Boring low level stuff
2009-09-11 14:22:48.063 MyApp[3122:207] NORMAL:+[MyClass myMethod:]:Higher level trace for more important info
2009-09-11 14:22:48.063 MyApp[3122:207] ALERT:+[MyClass myMethod:]:Really important trace, something bad is happening
2009-09-11 14:22:48.063 MyApp[3122:207] ERROR:+[MyClass myMethod:]:Error, this indicates a coding bug or unexpected condition
2009-09-11 14:22:48.073 MyApp[3122:207] EXIT:+[MyClass myMethod:]

nos définitions de trace:

#ifndef TRC_LEVEL
#if TARGET_IPHONE_SIMULATOR != 0
#define TRC_LEVEL 0
#else
#define TRC_LEVEL 5
#endif
#endif

/*****************************************************************************/
/* Entry/exit trace macros                                                   */
/*****************************************************************************/
#if TRC_LEVEL == 0
#define TRC_ENTRY    NSLog(@"ENTRY: %s:%d:", __PRETTY_FUNCTION__,__LINE__);
#define TRC_EXIT     NSLog(@"EXIT:  %s:%d:", __PRETTY_FUNCTION__,__LINE__);
#else
#define TRC_ENTRY
#define TRC_EXIT
#endif

/*****************************************************************************/
/* Debug trace macros                                                        */
/*****************************************************************************/
#if (TRC_LEVEL <= 1)
#define TRC_DBG(A, ...) NSLog(@"DEBUG: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_DBG(A, ...)
#endif

#if (TRC_LEVEL <= 2)
#define TRC_NRM(A, ...) NSLog(@"NORMAL:%s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_NRM(A, ...)
#endif

#if (TRC_LEVEL <= 3)
#define TRC_ALT(A, ...) NSLog(@"ALERT: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_ALT(A, ...)
#endif

#if (TRC_LEVEL <= 4)
#define TRC_ERR(A, ...) NSLog(@"ERROR: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_ERR(A, ...)
#endif

paramètres de Xcode:

dans les paramètres de construction de Xcode, choisissez "Ajouter le paramètre défini par L'Utilisateur" (en cliquant sur little cog en bas à gauche de l'écran de configuration de build), puis définir un nouveau paramètre appelé GCC_PREPROCESSOR_DEFINITIONS et lui donner la valeur TRC_LEVEL=0 .

la seule subtilité est que Xcode ne sait pas faire une construction propre si vous changez ce paramètre, alors n'oubliez pas de faire manuellement un nettoyage si vous le changez.

37
répondu Dan J 2018-01-13 01:02:44

Apple recueille automatiquement les journaux de crash des utilisateurs pour vous, et vous pouvez les télécharger à partir de iTunes connect.

si cela ne vous suffit pas, Je ne suis pas au courant d'une boîte à outils, mais je ne voudrais pas lancer quelque chose tout seul, personnellement. Il semble que trop d'efforts pour développer quelque chose de robuste, pourrait soulever des préoccupations de confidentialité, et à la fin, avec 100 000 K applications dans l'app store, combien d'utilisateurs utiliseraient votre application à nouveau après avoir découvert qu'il était buggy?

4
répondu bpapa 2009-11-03 15:40:04

savez-vous que CrashReporter pour iPhone existe?

il y a un repository sur github qui affiche ce code.

il a quelques traits frais comme le mapping de la trace de pile à votre code et gère des choses spécifiques de git comme la version hashes.

4
répondu Jens Kohl 2009-11-11 23:48:33

je recommande fortement le CocoaLumberJack de Robbie Hanson: https://github.com/robbiehanson/CocoaLumberjack

il est très souple et puissant peut-être même un peu excessive si abusé. Supporte différents niveaux de journalisation. La connexion aux fichiers peut être activée avec quelques lignes de code et même être envoyée sur le réseau.

2
répondu dagnytaggart 2013-04-23 16:21:25