2009-10-27 30 views
1

J'ai une panne qui se produit en profondeur dans UIKit pour une raison quelconque; une erreur EXC_BAD_ACCESS se produit quelque chose comme 8 appels profonds dans un appel dismissModalViewController. J'ai essayé d'activer NSZombieEnabled pour mon exécutable, mais le journal de la console imprime la même erreur, que les zombies soient activés ou non et je ne sais pas quel objet est à l'origine du problème. Y at-il quelque chose qui me manque que je dois faire pour obtenir la console pour imprimer les informations correctes?NSZombieEnabled ne signale pas le type d'objet provoquant une erreur EXC_BAD_ACCESS

+1

Nous avons vraiment besoin de voir une trace de pile sur celui-ci. Soit vous libérez quelque chose dans dealloc qui est déjà libéré, soit vous appelez quelque chose qui utilise quelque chose qui a été libéré, ou peut-être que quelque chose tente de rappeler la vue modale rejetée après qu'elle a été rejetée. –

Répondre

1

En savoir plus sur l'utilisation de Zombies here.

Exécutez ceci dans gdb. Lorsque vous obtenez le EXC_BAD_ACCESS regardez la pile à ce point (utilisez la commande where de gdb ou exécutez le débogueur de l'interface graphique Xcode). Si vous avez encore des problèmes, postez la pile dans votre question initiale.

De plus, les zombies ne vous seront utiles que si vous traitez des objets NSO. Si vous utilisez des routines de bas niveau de malloc/free zombies ne vous achetez rien pour ces allocations.

+0

Votre dernière déclaration était probablement le cas. C'était quelque chose qui trébuchait dans le code d'animation de base qui s'est écrasé parce que certaines actions antérieures dans l'application empêcheraient toute animation de se produire; Heureusement, des devinettes éclairées m'ont permis de résoudre le problème. – Kevlar

+0

Le lien 'here' dans le post de @ nall mène à une page de CocoaDev qui existe depuis toujours. Ce qui n'est pas nécessairement mauvais dans le monde d'UNIX, mais soyez fatigué de copier les paramètres ~/.gdbinit qu'AdhamhFindlay fournit de façon si réfléchie. Je l'ai fait, quelque part autour de Xcode 2.2, à ce moment-là, ils semblaient ne faire aucun mal et très peu de bien, mais je les ai depuis enlevés. Si vous ressentez le besoin de modifier les paramètres gdb, utilisez les paramètres Target Info >> Build de Xcode pour le faire. En ce qui concerne NSZombieEnabled, il me semble souvent aussi utile que les créatures dont il porte le nom. –

+0

Quelle est la raison de ne pas utiliser .gdbinit? Mettre les paramètres uniquement dans Xcode empêche gdb de respecter ceux qui s'exécutent en dehors de Xcode (ce que je fais souvent) – nall

-1

Il semble que quelque chose soit trop relâché dans votre Modal View Controller. Commencez par commenter les lignes nouvelles jusqu'à ce qu'elles cessent de se rompre.

+0

Je sais, mais cela ne répond pas à la question de savoir pourquoi NSZombieEnabled ne fonctionne pas comme annoncé, ce qui rendrait le débogage beaucoup plus simple. – Kevlar

+2

Commenter de façon aléatoire des lignes "newish" est une manière terriblement inefficace de déboguer ceci. – nall

+0

Peut-être pour vous, mais pour la façon dont j'écris mon code (moins c'est plus), c'est assez efficace. – coneybeare

1

Une chose que j'ai apprise le week-end dernier quand NSZombieEnabled ne semblait pas fonctionner du tout - assurez-vous que vous ne passez pas un non-objet à du code.

Dans mon cas, je retournais un NSString comme juste "chaîne" au lieu de @ "chaîne". Cela signifiait que je remplaçais un objet NSString avec la chaîne de caractères. Quand j'ai essayé plus tard d'écrire une nouvelle valeur dans cet objet, j'obtenais un BAD_ACCESS. NSZombie ne pouvait pas aider b/c ce n'était pas un objet que j'essayais d'écraser, mais ce c-string. En aparté, considérez tous les avertissements comme des erreurs dans XCode - j'aimerais pouvoir les faire apparaître en ROUGE dans l'interface graphique IDE - ils sont faciles à manquer parfois.

+1

La meilleure chose à faire pour les afficher en ROUGE est de cocher "Traiter les avertissements comme des erreurs" dans la section Build de la cible Info. –