2009-08-24 2 views
11

J'ai un accident qui se produit lorsqu'un NSAutoreleasePool draine. Vraisemblablement, le pool tente de libérer un objet qui a été libéré prématurément par un autre morceau de code. Le crash que j'ai est au milieu de objc_msgSend car il essaie d'envoyer un message à un objet qui n'existe plus. Compte tenu de l'état de la pile, quelles commandes/astuces/processus/gdb ai-je à ma disposition pour obtenir des informations sur l'objet en question et/ou le point où l'abandon illégitime a eu lieu?Comment mieux déboguer un crash dans objc_msgSend?

Répondre

16

Si vous avez l'impression que c'est une suppression prématurée, activez les zombies pour confirmer votre hypothèse et ensuite déboguer ce qui se passe. Lorsque vous activez les zombies, les objets ne sont pas vraiment détruits, mais mis dans un état de zombie, ce qui vous aide à détecter quand ils sont accédés après l'appel de dealloc. Lire la suite de NSZombieEnabled

+3

De plus, vous pouvez utiliser l'instrument Object'oc Instruments pour suivre les événements de conservation/libération de l'objet qui a été libéré prématurément. Ce n'est pas la libération du pool d'autorelease qui pose problème, mais plutôt une libération antérieure. – bbum

+0

@Pang Je viens de mettre à jour le lien. – inga

3

Si vous utilisez NSZombieEnabled, vous pouvez au moins déterminer quelle classe est l'objet.

+2

Alors que correct, tequilatango de La réponse fournit la réponse avec quelques détails utiles. – bbum

+0

Tout à fait vrai. J'aurais pu au moins fournir un lien vers des informations externes. – Wevah

2

je suis tombé sur ce qui semblait être un accident dans objc_msgSend. Ce qui était encore plus étrange était application:didFinishLaunchingWithOptions: n'était même pas atteint avant que le soi-disant accident se produise! Dans mon cas, le crash s'est avéré être un point d'arrêt que j'avais défini par inadvertance sur une adresse mémoire qui était appelée avant même que mon code ne soit atteint.

enter image description here

Après l'heure ou d'essayer de comprendre cela, je décoché le point d'arrêt, a couru le code, le visage palmed puis continué ma journée prétendant qu'il était jamais arrivé ...