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
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
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.
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.
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.
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.
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
Ensuite, l'étape suivante consiste à l'exécuter avec NSZombieEnabled. –
- 1. Accéder au contrôleur dans une application Cocoa
- 2. Pourquoi ce code provoque-t-il une erreur de segmentation?
- 3. Pourquoi ai-je une erreur de segmentation avec ce code?
- 4. Ruby moniteur erreur de segmentation
- 5. Erreur de segmentation dans QAbstractItemModel personnalisé
- 6. Erreur de segmentation JNI bug
- 7. Possibilité d'utiliser le framework iPhoneSimulators dans une application Cocoa?
- 8. erreur de segmentation en utilisant OMP
- 9. Erreur de segmentation d'une caméra avec MATLAB
- 10. Pourquoi ai-je une erreur de segmentation (core dumped) lorsque j'essaie d'allouer une matrice 4D?
- 11. Pourquoi ai-je une erreur isEqualToString dans ce code Cocoa?
- 12. L'ajout d'un membre int à une structure C provoque une erreur de segmentation
- 13. Ouverture d'une URL non standard dans une application Cocoa
- 14. Comment puis-je éviter une erreur de segmentation tout redimensionner un vecteur comme celui-ci
- 15. Comment créer une interface de ligne de commande pour une application GUI Cocoa?
- 16. Utiliser une localisation spécifique dans l'application Cocoa
- 17. comment créer une classe de catégorie dans Cocoa objectif-c
- 18. Comment créer une barre de progression verticale dans Cocoa?
- 19. Application Cocoa Helper
- 20. Comment puis-je collecter des données clés dans une application Cocoa de style jeu vidéo?
- 21. erreur de segmentation sur Unix - corruption de pile possible
- 22. Comment créer une fenêtre Cocoa par programme?
- 23. Création d'un écran Nag pour une application Cocoa
- 24. Défaut de segmentation et de segmentation
- 25. Comment supprimer la "tête de boîte" dans une application Facebook?
- 26. Quelqu'un a trouvé une bibliothèque Cocoa Touch pour intégrer Bing Maps dans une application iPhone?
- 27. Comment faire une recherche plein texte dans Cocoa?
- 28. Erreur de segmentation de lancement de script php osx
- 29. TokyoCabinet: Erreur de segmentation à hdb-> close()
- 30. Comment terminer une animation plus tôt dans Cocoa Touch?
Ne faites pas ces choses ensemble. NSZombieEnabled fera apparaître des "fuites" dans Instruments. – nall
+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. –