2009-11-08 5 views
2

J'ai un problème assez bizarre dans mon application iPhone qui est, je pense, liée à la mémoire d'obtenir endommagé:Problème de mémoire de l'iPhone OS - comment déboguer?

À un moment donné, je dois trier un tableau, que je fais avec -[sortArrayUsingFunction].

Le résultat n'est pas correct sauf si j'allouer de la mémoire avec quelque chose comme void *test = malloc(2 * sizeof(int)) avant l'appel de méthode ou avoir, par exemple, un appel à NSLog() (qui n'est jamais invoqué) dans la fonction de tri. En d'autres termes: le tri ne fonctionne que si j'augmente légèrement la mémoire utilisée avant d'appeler la fonction de tri. Je pense que c'est parce qu'à un certain moment, la mémoire est corrompue.

Comment déboguer quelque chose comme ça?

+0

Je suppose que vous utilisez NSMutableArray sortUsingFunction: context :? Vous devriez afficher la fonction de tri. – TechZen

+0

L'affichage de la fonction de tri ne vous sera d'aucune aide si vous ne connaissez pas le contexte (trop complexe) de mon application. Je ne pense pas non plus que le problème réside dans la fonction de tri, car cela échouerait toujours. – mrueg

Répondre

3

Il semble que votre code utilise des objets déjà lancés. Beaucoup d'aide pour déboguer ce genre d'erreurs est fourni dans la note technique Mac OS X Debugging Magic d'Apple, en particulier la partie foundation.

Pour désactiver les autorelease pools (définition de la variable d'environnement NSEnableAutoreleasePool=NO) ou utiliser la fonction zombie (NSZombieEnabled=YES) pour trouver des endroits où vous envoyez des messages aux objets libérés.

+0

Le problème semble disparaître lorsque j'ai défini NSEnableAutoreleasePool = NO. Mais je ne reçois aucun message lors de la définition de NSZombieEnabled et si je ne mets pas NSEnableAutoreleasePool à NO, mais que le pool est nul dans main.m (ce qui devrait être équivalent), le problème est toujours là ... Tout est encore très bizarre, mais autorelease _might_ être le problème. – mrueg

+0

Bon, maintenant vous maintenant que sur-relâcher est probablement le problème. Essayez d'abord l'analyseur statique (clang). Ensuite, si vous ne trouvez pas le problème, commencez à regarder les objets suspects et conservez-les. Si le problème disparaît, vous savez quel objet est libéré avant son heure. –

+0

B.t.w .: Bien sûr, vous devez activer les pools autorelease lors de l'activation de la détection de zombies. –

0

De telles choses peuvent être un défi pour le débogage. Il y a quelques outils pour détecter les accès hors-limites et autres sur d'autres plateformes, donc je présume qu'il y aurait quelque chose pour l'iPhone, mais je n'en connais pas.

Vous devriez peut-être stocker deux copies du tableau, et les comparer pour les différences. Imprimez les différences. La nature de la «jonque» qui a été présentée à l'un des tableaux pourrait donner un indice quant à sa provenance.

De même, parcourez le code qui précède ce point et relisez-le (ou, mieux encore, demandez à quelqu'un d'autre de le lire). Vous pourriez repérer un bug.