123 votes

Xcode ne montre pas la ligne qui cause un crash

Chaque fois que mon application se bloque Xcode met en évidence la UIApicationMain() appel de la fonction main() tant que la ligne qui a provoqué l'incident. Dans certains cas, que l'habitude d'être normal (erreur de segmentation par exemple), mais le crash, je suis en train d'essayer de traiter avec un simple SIGABRT avec des informations détaillées enregistré dans la console:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Date)'

Xcode utilisé pour montrer la ligne droite avec les anciens Kits de développement logiciel, mais depuis que j'ai mis à Xocde 4.2 qui a changé. Il est assez évident que Xcode sait exactement ce qui a causé l'accident (ou pouvait savoir), mais sa reste pas montrant la ligne actuelle. Est-il un correctif ou une solution pour cela?

299voto

Carter Points 2502

Vous devez également vous assurer que vous avez les points d'arrêt définis pour toutes les exceptions. Ce sera la cause de Xcode pour s'arrêter à la ligne où l'erreur est survenue. Procédez de la manière suivante [dans Xcode 4]:

  1. Dans le Navigateur de Projets sur le côté gauche de Xcode, cliquez sur le point d'arrêt navigator (presque tout le chemin vers le côté droit de la partie supérieure de la barre de boutons. L'icône ressemble à une grosse flèche vers la droite).

  2. En bas du navigateur, cliquez sur le bouton"+".

  3. Cliquez Sur "Ajouter Une Exception De Point D'Arrêt".

  4. Un nouveau point d'arrêt sera créé. Il doit être configuré en tant que de besoin, mais vous pouvez modifier son comportement.

  5. Exécutez votre projet et de le reproduire à l'exception.

Aussi vous avez mentionné que vous avez lié à certaines 3ème partie librairies/frameworks. Si l'exception se produit à l'intérieur de ces cadres, alors vous allez avoir un moment difficile depuis que le code est compilé et Xcode ne pouvez pas vraiment vous montrer la ligne qui a provoqué l'exception. Si c'est le cas et que vous êtes certain que vous êtes en utilisant les bibliothèques correctement, alors vous devez déposer un rapport de bug pour les responsables de ces bibliothèques.

8voto

chown Points 25161

Modifier le régime actuel et activer NSZombieEnabled, MallocStackLogging, et guard malloc. Puis, lorsque votre Application se bloque, tapez ceci dans le gdb console:

(gdb) info malloc-history 0x543216

Remplacer 0x543216 avec l'adresse de l'objet qui a provoqué l' NSInvalidArgumentException et il devrait vous donner une beaucoup plus utile trace de la pile, montrant les lignes de code qui sont à l'origine du crash.

2voto

NSBum Points 6570

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 peut aider. (Paramètre de niveau d'optimisation LLVM 3.0)

Générez-vous des symboles de débogage?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X