2009-08-24 4 views
11

Tengo un accidente cuando se drena un NSAutoreleasePool. Presumiblemente, el grupo intenta desasignar un objeto que ha sido liberado prematuramente por otro fragmento de código. La falla que tengo se encuentra en el medio de objc_msgSend ya que está intentando enviar un mensaje a un objeto que ya no existe.¿Cuál es la mejor forma de solucionar un error en objc_msgSend?

Dado el estado de pila, ¿qué comandos/tricks/processes/gdb tengo a mi disposición para obtener información sobre el objeto en cuestión y/o el punto en el que tuvo lugar la desasignación ilegítima?

Respuesta

16

Si tiene la corazonada de que es una eliminación prematura, habilite zombies para confirmar su hipótesis y luego depurar lo que está sucediendo. Cuando habilitas zombies, los objetos no se destruyen realmente, sino que se configuran en un estado zombie, que te ayuda a detectar cuándo se accede después de llamar a dealloc. Leer más de NSZombieEnabled

+3

Además, puede usar el instrumento Object Alloc de Instruments para rastrear los eventos de retención/liberación del objeto que se liberó prematuramente. No es el release del grupo de autorreleases, ese es el problema, sino algunos, por lo general, de liberación. – bbum

+0

@Pang Acabo de actualizar el enlace. – inga

3

Si usa NSZombieEnabled, al menos puede averiguar qué clase es el objeto.

+2

Mientras que correcta, de tequilatango la respuesta proporciona la respuesta junto con algunos detalles útiles. – bbum

+0

Bastante cierto. Al menos podría haber proporcionado un enlace a información externa. – Wevah

2

me encontré con lo que parecía ser un accidente en objc_msgSend. ¡Lo que era aún más extraño fue que application:didFinishLaunchingWithOptions: ni siquiera se alcanzó antes de que se produjera el llamado bloqueo!

En mi caso, el bloqueo resultó ser un punto de interrupción que involuntariamente había establecido en una dirección de memoria que se llamaba antes de que se alcanzara siquiera mi código.

enter image description here

Después de la hora o así de tratar de resolver esto, que yo no se el punto de interrupción, corriendo el código, cara palmed y luego continuó mi día pretender que nunca había sucedido ...

Cuestiones relacionadas