2008-11-17 7 views
6

Lorsque sur la libération d'un pointeur, vous pouvez voir une erreur commeiPhone - débogage des erreurs « pointeur étant libéré n'a pas été alloué »

« pointeur étant libéré n'a pas été affecté »

Lors du débogage avec le simulateur, je ajouter un argument de construction MallocStackLogging = YES - ceci me permet d'utiliser malloc_history dans le terminal pour localiser où j'ai sur-libéré un pointeur.

Si je débogage sur l'appareil avec cet argument de construction je reçois toutes sortes d'erreurs de la console « ne peut pas créer des fichiers journaux de la pile », etc.

Bizarrement, je reçois des erreurs de pointeur sur libérés apparaissant sur l'appareil, mais pas sur le simulateur.

Quelqu'un a-t-il déjà eu de l'expérience en les dépistant en utilisant l'appareil lui-même?

Merci!

Répondre

1

J'utilise généralement NSZombie pour de telles choses, consultez this sur

0

Vous devez définir les variables d'environnement MallocStackLogging sur l'exécutable cible ...

Pour accéder à ces paramètres, sélectionnez votre exécutable à partir des groupes & Volet Fichiers dans XCode, puis Obtenir des informations.

Aller à l'onglet Arguments et ajoutez les entrées suivantes dans la case « Variables à l'environnement »:

9

Une autre façon de le faire. Assurez-vous d'activer NSZombie afin qu'il indique l'adresse mémoire de l'objet qui obtient la version supplémentaire. Ensuite, exécutez avec Performance Tool-> Allocations d'objets. Cela amènera des instruments. Regardez le journal de la console fourni par Xcode organizer. Une fois que vous obtenez le crash, recherchez l'adresse de la mémoire dans les instruments. Vous verrez l'historique complet de mallocs/libres sur cet objet, ainsi que des liens directement dans votre code.

+2

Je n'ai pas pu obtenir avec ces directions exactes (dans Xcode 4.2.1) - j'avais pour parcourir Xcode, puis attacher des instruments pendant qu'il était en cours d'exécution. J'avais "Activer les objets Zombie" activé pour mon schéma actuel, et une fois que j'ai déclenché l'exception, Instruments s'est accroché comme un champion et m'a emmené à l'histoire de l'adresse du zombie. J'ai regardé la trace de la pile pour l'allocation initiale, et j'ai vu une [autorelease] inutile qui provoquait l'exception. Outil génial! – Dov

+0

Le "comment" complet est affiché sur la vidéo WWDC de 2010 appelée "Session 311 - Analyse avancée de la mémoire avec des instruments" à 31:50. – brainray

0

S'il vous plaît tester le programme pour les fuites de mémoire, Vérifiez également les libérations automatiques et si vous libérez des objets correctement ou non. Nous devons également vérifier si un objet libéré a une mémoire allouée ou non. Vous devez également faire attention à autorelease, car accidentellement nous pourrions libérer un tableau ou une chaîne ou tout autre objet déjà libéré ... espérons que cela aide et fonctionne!

Astuce: Vous pouvez tester les fuites en analysant votre projet (cliquez sur Maj + commande + k)

Questions connexes