Comment voulez-vous mettre en œuvre iPhone de la gestion des exceptions?
J'ai un crash dans mon application iPhone qui n'jeter un NSException. Les rapports d'erreur sont complètement ambigu dans l'erreur et qu'est-ce exactement qui en est la cause. Est-il une façon intelligente pour moi de mettre un haut niveau de gestionnaire d'exception quelque part pour voir ce qui en est la cause? Je ne peux pas reproduire le problème moi-même, mais quelques-uns de mes utilisateurs de la version bêta, certainement.
Ce qui est une façon intelligente de gérer un problème de cette nature?
Vous devez vous connecter pour publier un commentaire.
Il semble que vous vous poser deux questions: comment définir un niveau supérieur gestionnaire d'exception; et la façon de traiter la question de la détermination de ce que la cause est.
Attraper l'exception peut être fait de plusieurs façons différentes, mais pour cela, la meilleure approche semble être de définir un gestionnaire d'exception à l'aide de NSSetUncaughtExceptionHandler.
Lorsqu'une exception est déclenchée dans votre application, il est géré par un gestionnaire d'exceptions par défaut. Ce gestionnaire ne fait rien de plus que l'enregistrement d'un message à la console avant l'application se ferme. Vous pouvez contourner ce problème en définissant vous propre gestionnaire d'exception à l'aide de la fonction indiquée ci-dessus. Le meilleur endroit pour le faire, ce serait dans l'app délégué applicationDidFinishLaunching: méthode.
Une fois que vous avez défini un gestionnaire personnalisé, vous aurez envie de développer sur la sortie par défaut pour vous aider à déterminer quelle est la cause.
Malheureusement par rapport à OSX iPhone semble assez limitée en ce qui concerne la production d'une belle trace de la pile. Le code ci-dessus va produire certains apparemment indésirable de sortie; toutefois, vous pouvez exécuter cette sortie dans les atos de l'outil, et vous devriez être en mesure de générer un utile trace de la pile d'elle.
Une autre option est de suivre les instructions sur cet article qui permettra de produire une belle trace de la pile automatiquement.
Que cela va à des beta-testeurs, vous pouvez avoir à bricoler sur le point de le faire fonctionner pour vous.
Vous dire que vous n'avez pas été en mesure de reproduire le problème vous-même, seulement à vos utilisateurs. Dans ce cas, vous pourriez trouver cette note technique d'Apple utiles:
https://developer.apple.com/library/content/technotes/tn2151/_index.html
Mise à JOUR: ce post contient toujours des infos utiles, certains des liens qu'il contient sont morts de façon irréversible. Il est conseillé d'utiliser l'info de cette alternative post.
Exception stack: (0x1b35efef8 0x1b27bda40 0x1b34f4ac4 0x1b3f68b6c 0x1b3f9e528 0x100dc6950 0x100dc9b8c 0x100dc60e4 0x102304dac 0x1023057f8 0x1023851ec 0x1011e8ec4 0x1b30276c8 0x1b3028484 0x1b2fcb4d8 0x1b2fd7a60 0x1b2fd8308 0x1b320a190 0x1b320cd00)
Mais je veux voir les chemin de la chaîne.Si vous envisagez de le faire sur votre propre vous pouvez utiliser l'une de ces approches
Approach1:
De bookshare 2:
Approcach3:
Remarque:
Dans mon point de vue, n'essayez pas d'envoyer les détails de l'exception au serveur
au moment de l'envoyer s'écraser quand il commence de nouveau l'application.
Si vous allez utiliser NSUserDefaults pour enregistrer les détails de l'exception, alors vous devez le synchroniser au moment de s'écraser, sinon ça ne pas persister.
L'extrait de code suivant fait le travail.
[[NSUserDefaults standardUserDefaults]synchronize]
)il après l'enregistrementDans XCode, vous devez toujours définir un point d'arrêt global pour
objc_exception_throw
. Ensuite, vous (en général) beaucoup plus de sens de la trace de pile à ce qui est en train d'essayer de lancer une exception.Vous pouvez toujours obtenir des exceptions qui proviennent de la minuterie de code ou d'autres lieux sans votre propre code n'importe où dans la trace, mais si vous regardez la méthode de la chaîne, vous pouvez généralement déterminer généralement ce que l'exception est d'environ (comme d'avoir une notification lorsque la cible est allé).
Avez-vous essayé
NSSetUncaughtExceptionHandler
?Une autre option pour le suivi des rapports d'incident est Plausible CrashReporter, le code open source pour vous envoyer automatiquement des rapports d'erreur à partir du champ.
Il y a aussi le CrashReporterDemo, une autre option open source qui est une combinaison de Plausible CrashReporter et un serveur de code afin de mieux suivre les rapports de plantage.
Et enfin, il y a MacDevCrashReporter, un service qui semble avoir des similitudes iOSExceptional.com, a suggéré dans une autre réponse. Je n'ai aucune idée de ce que leurs modalités de service sont, comme je n'ai pas signé pour la bêta. Certainement la peine de vérifier avant d'entrer trop profondément.
Découvrez Crittercism. Il passe au-dessus et au-delà de ce que vous demandez d'ici qu'il vous permet de vous obtenir cette information pour tous les utilisateurs à l'aide de votre application, donc vous devriez être en mesure de voir votre propre crash.
Vous pouvez également télécharger la DYSM de votre build et il sera automatiquement symbolicate l'incident pour vous sur leur site web. Que doit vous fournir le plus clair stack-trace sans être accroché à la débogueur.
Vous pourriez aussi vous voulez vous assurer que vous êtes prêt à casser sur Objectif-C exceptions. Dans Xcode 4, dans les points d'arrêt onglet, vous pouvez ajouter un point d'arrêt d'Exception qui se brise sur les deux/C++ et l'Obj-C exceptions. Sans cela, la plupart des traces de pile pour les exceptions levées sont assez peu utile.
Bonne chance!