2008-11-17 11 views
6

Cuando sobre la liberación de un puntero es posible que aparezca un error comoiPhone - depuración "puntero siendo liberado no fue asignado" errores

"puntero está liberando no se asignó"

Cuando se depura con el simulador, yo agregar un argumento de compilación MallocStackLogging = YES - esto me permite usar malloc_history en el terminal para rastrear donde he liberado un puntero.

Si elimino errores en el dispositivo con este argumento acumulación consigo todo tipo de errores de la consola "no puede crear archivos de registro de pila", etc.

Curiosamente, consigo algunos errores puntero sobre liberados que aparecen en el dispositivo, pero no en el simulador

¿Alguien ha tenido alguna experiencia rastreando estos utilizando el dispositivo?

Gracias!

Respuesta

1

Yo generalmente uso NSZombie para este tipo de cosas, echa un vistazo a this

0

Es necesario ajustar las variables env MallocStackLogging en el ejecutable de destino ...

Para acceder a esta configuración, seleccione su ejecutable a partir de los Grupos & Panel de archivos en XCode, luego Obtener información.

Ir a la pestaña Argumentos y añadir las siguientes entradas en las “Variables que se creará en el entorno de” caja:

9

Otra manera de hacer esto. Asegúrese de activar NSZombie para que informe la dirección de memoria del objeto que obtiene la versión extra. Luego ejecute con Performance Tool-> Object Allocations. Esto traerá los instrumentos. Mire el registro de la consola como lo proporciona el organizador de Xcode. Una vez que obtenga el crash, busque la dirección de memoria en los instrumentos. Verá el historial completo de Mallocs/Free en ese objeto, así como enlaces directamente a su código.

+2

yo no era capaz de conseguir que con estas direcciones exactas (en Xcode 4.2.1) - que tenía para ejecutar a través de Xcode, luego conecte los instrumentos mientras se estaba ejecutando. Tenía activado "Activar objetos Zombie" para mi esquema actual, y una vez que activé la excepción, los instrumentos se engancharon como un campeón y me llevaron a la historia de la dirección del zombi. Miré el rastro de la pila para la asignación inicial, y vi un '[liberación automática] innecesario que causaba la excepción. Herramienta impresionante! – Dov

+0

El "cómo hacerlo" completo se muestra en el video de la WWDC de 2010 denominado "Sesión 311 - Análisis avanzado de memoria con instrumentos" a las 31:50. – brainray

0

Pruebe el programa para detectar fugas de memoria, también revise las autorreleases y si está liberando objetos correctamente o no. También debemos verificar si un objeto liberado tiene o no memoria asignada. También debe tener cuidado con la liberación automática. porque accidentalmente podríamos lanzar una matriz, una cuerda o cualquier objeto que ya se haya lanzado automáticamente ... ¡espero que ayude y funcione!

Consejo: Puede comprobar si hay fugas mediante el análisis de su proyecto (shift + clic comando + k)

Cuestiones relacionadas