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
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
L'article définitif sur ce genre de collision: http://www.sealiesoftware.com/blog/archive/2008/09/22/objc_explain_So_you_crashed_in_objc_msgSend.html
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.
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é ...
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
@Pang Je viens de mettre à jour le lien. – inga