Chaque fois que mon application plante, Xcode met en évidence l'appel UIApicationMain () dans la fonction main () comme la ligne qui a causé le crash. Dans certains cas, c'était normal (erreur de segmentation par exemple) mais le crash que j'essaie de gérer est un simple SIGABRT avec des informations détaillées enregistrées dans la console:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Date)'
Xcode avait l'habitude d'afficher la ligne juste avec les anciens SDK, mais depuis la mise à niveau vers Xocde 4.2, cela a changé. Il est assez évident que Xcode sait exactement ce qui a causé le crash (ou pourrait le savoir), mais il ne montre toujours pas la ligne réelle. Existe-t-il un correctif ou une solution de contournement pour cela?
Réponses:
Vous devez également vous assurer que vous avez défini des points d'arrêt pour toutes les exceptions. Cela entraînera l'arrêt de Xcode à la ligne où l'exception se produit. Procédez comme suit [dans Xcode 4]:
Dans le navigateur de projet sur le côté gauche de Xcode, cliquez sur le navigateur de point d'arrêt (presque tout le chemin vers le côté droit de la barre de boutons supérieure. L'icône ressemble à une grosse flèche droite).
Au bas du navigateur, cliquez sur le bouton "+".
Cliquez sur "Ajouter un point d'arrêt d'exception".
Un nouveau point d'arrêt sera créé. Il doit être configuré selon les besoins, mais vous pouvez modifier son comportement.
Exécutez votre projet et reproduisez l'exception.
Vous avez également mentionné que vous vous êtes lié à des bibliothèques / frameworks tiers. Si l'exception se produit dans ces cadres, vous allez avoir du mal car le code est compilé et Xcode ne peut pas réellement vous montrer la ligne qui a causé l'exception. Si tel est le cas et que vous êtes certain que vous utilisez correctement les bibliothèques, vous devez alors déposer un rapport de bogue aux responsables de ces bibliothèques.
la source
Suivez simplement les instructions de cette réponse StackOverflow:
Activer les zombies
En gros, il vous suffit de "Activer les zombies". Ensuite, Xcode devrait se briser sur la ligne à l'origine du problème.
(Il est absolument choquant que, même en 2017, Xcode ait toujours ceci désactivé par défaut. Pourquoi ne voudriez-vous pas voir la ligne qui a causé le problème? Et " Activer les objets Zombie "?! Vraiment?! Les auteurs de Xcode vraiment pense que c'est un nom utile, qui aurait du sens pour les nouveaux développeurs? Il est déprimant de constater à quel point la note de Xcode est médiocre, année après année, dans l'App Store. Personne n'écoute ...)
la source
Modifier le régime actuel et permettre
NSZombieEnabled
,MallocStackLogging
etguard malloc
. Ensuite, lorsque votre application plante, saisissez ceci dans la console gdb:Remplacez-la
0x543216
par l'adresse de l'objet qui a causé leNSInvalidArgumentException
et cela devrait vous donner une trace de pile beaucoup plus utile, montrant les lignes de votre code qui causent le plantage.la source
J'ai vu ce comportement dans un code fortement optimisé; vérifier, ajuster le niveau d'optimisation de votre cible et ceux des bibliothèques tierces peuvent vous aider. (Réglage du niveau d'optimisation LLVM 3.0)
Générez-vous des symboles de débogage?
la source
J'ai écrit du code pour générer un crash d'index hors des limites. Voici l'exception lancée.
Si vous lisez attentivement le
First Throw call stack
0 and 1
sont les processus système après un crash.2
est la ligne qui a causé l'exception.3
vous indique que le nom de classe (ViewController
) et la fonction naem (ComplexFunction
) dans lesquels l'exception a été lancée.la source