2009-10-06 10 views
2

J'ai un problème avec une application Cocoa que j'écris. Il doit analyser un fichier horodaté qui est mis à jour toutes les heures et, pendant les tests, il se bloque constamment vers 23h45 en raison d'une erreur de segmentation. Je suppose que je dois envoyer un message à un objet qui a été désalloué. Quels outils sont fournis avec l'installation de Xcode pour suivre les allocations d'objets et (si possible) me dire si je suis en train de communiquer un objet qui a été désalloué? Je utilise Mac OS X 10.5.Comment puis-je retrouver une erreur de segmentation dans une application Cocoa?

Répondre

9

Je recommande ce qui suit:

  • Utilisez NSZombieEnabled pour surveiller lorsque les messages sont envoyés à NSObjects désallouées
  • Utilisez Instruments pour effectuer le suivi des allocations d'objets et/ou des fuites de mémoire
+4

Ne faites pas ces choses ensemble. NSZombieEnabled fera apparaître des "fuites" dans Instruments. – nall

+0

+1: Les objets NSZombie sont la méthode prescrite par Apple pour faire face à quelque chose comme ça. Et comme nall a dit, n'utilisez pas d'instruments avec des zombies activés. –

0

La façon dont je le fais est en utilisant un outil en ligne de commande appelé gdb. Here est un tutoriel sur la façon de l'utiliser. Vous devrez apprendre quelques-unes de ses commandes, mais une fois que vous le faites, c'est presque un plaisir d'utiliser.

Remarque: gbd peut être utilisé sur les programmes C, C++ et Objective-C.

0

Avez-vous exécuté le programme sous gdb? Cela devrait vous permettre d'inspecter la pile et les variables quand il s'agit de SIGSEGV. Pour suivre les affectations, utilisez malloc_history. Cela nécessite que la variable d'environnement MallocStackLogging soit définie.

0

Un point rapide : l'utilisation d'un emplacement de mémoire désalloué entraîne généralement une exception EXC_BAD_ACCESS. Si c'est la raison de l'accident que vous voyez alors vous avez raison de supposer que c'est un problème de désallocation.

0

Exécutez-le dans le débogueur de Xcode (qui est gdb avec une interface graphique en haut) et reproduisez le plantage. Ensuite, regardez la trace de la pile.

La messagerie d'un objet désalloué a généralement l'image supérieure dans objc_msgSend. L'étape suivante consiste alors à exécuter l'application avec NSZombieEnabled et reproduire le crash; le zombie s'identifiera.

+0

Le crash a été un peu difficile à reproduire, mais je sais d'après les journaux de plantage que la panne est survenue dans 'objc_msgSend'. – mipadi

+0

Ensuite, l'étape suivante consiste à l'exécuter avec NSZombieEnabled. –

Questions connexes