¿Cómo depurar memory leaks cuando el instrumento Leaks no las muestra?

Tengo una aplicación de iOS escrita en Swift que está perdiendo memoria: en cierta situación, algunos objetos deberían ser liberados, pero no lo son. He aprendido sobre el problema simplemente agregando mensajes de depuración de deinit como este:

 deinit { println("DEINIT: KeysProvider released") } 

Por lo tanto, el mensaje de inicio de sesión debería estar presente en la consola después de dichos eventos que deberían provocar el lanzamiento del objeto. Sin embargo, para algunos de los objetos que deberían publicarse, el mensaje falta. Aún así, Leaks Developer Tool no muestra ninguna fuga. ¿Cómo resuelvo tal situación?

En Xcode 8, puede hacer clic en el botón “Depurar gráfico de memoria”, debugmemorygraphbutton en la barra de herramientas de depuración (que se muestra en la parte inferior de la pantalla):

gráfico de memoria de depuración

Simplemente identifique el objeto en el panel izquierdo que cree que debería haber sido desasignado, y le mostrará el gráfico del objeto (que se muestra en el canvas principal, arriba). Esto es muy útil para identificar rápidamente dónde se establecieron las referencias sólidas sobre el objeto en cuestión. Desde aquí, puede comenzar su investigación, diagnosticando por qué esas referencias sólidas no se resolvieron (por ejemplo, si el objeto en cuestión tiene una referencia fuerte de otra cosa que debería haber sido desasignado, mire también el gráfico de ese objeto, y puede encontrar el problema (p. ej., ciclos de referencia fuertes, temporizadores repetitivos, etc.).

Tenga en cuenta que en el panel de la derecha, veo el árbol de llamadas. Lo obtuve activando la opción de registro “stack malloc” en la configuración del esquema:

pila malloc

De todos modos, una vez hecho esto, uno puede hacer clic en la flecha al lado de la llamada al método relevante que se muestra en el seguimiento de la stack en el panel derecho de la primera instantánea de la pantalla anterior, y puede ver dónde se estableció originalmente esa referencia fuerte:

código

La técnica de diagnóstico de memoria anterior (y más) se demuestra en la última parte de WWDC 2016 Depuración visual con Xcode .


La técnica de Instrumentos tradicionales (especialmente útil si se usan versiones anteriores de Xcode) se describe a continuación, en mi respuesta original.


Yo sugeriría usar la herramienta “Asignaciones” de Instruments con la función “Record Reference Counts”:

registrar recuentos de referencia

Luego puede ejecutar la aplicación en Instruments y luego buscar su clase que sabe que está goteando y hacer taladrar haciendo clic en la flecha:

enter image description here

A continuación, puede profundizar en los detalles y observar el trazado de la stack utilizando el panel “Detalles ampliados” a la derecha:

detalles extendidos

En ese panel de “Detalles ampliados”, enfóquese en el código en negro en lugar de las llamadas al sistema en gris. De todos modos, desde el panel de “Detalles ampliados”, puede acceder a su código fuente, directamente en Instruments ::

tu codigo

Para obtener más información y demostraciones sobre el uso de instrumentos para rastrear problemas de memoria, consulte:

  • WWDC 2013 video Problemas de reparación de memoria
  • WWDC 2012 video iOS App Performance: Memoria

Use instrumentos para verificar fugas y pérdida de memoria debido a la memoria retenida pero no filtrada. Esta última es memoria no utilizada a la que todavía se apunta. Use Mark Generation (Heapshot) en el instrumento Allocations en Instrumentos.

Para obtener información sobre cómo usar Heapshot para encontrar memoria, consulte: bbum blog

Básicamente, el método consiste en ejecutar una herramienta de asignación de instrumentos, tomar una foto de inicio, ejecutar una iteración de su código y tomar otra secuencia de repetición 3 o 4 veces. Esto indicará la memoria que se asigna y no se libera durante las iteraciones.

Para descubrir los resultados, divulgue para ver las asignaciones individuales.

Si necesita ver dónde se guardan, liberaciones y autorreleases para un objeto, use instrumentos:

Ejecutar en instrumentos, en Asignaciones establecer “Recordar recuentos de referencia” en (Para Xcode 5 y más bajo, debe detener la grabación para configurar la opción). Haga que la aplicación se ejecute, detenga la grabación, profundice y podrá ver dónde se produjeron todas las retenciones, lanzamientos y autorreleases.

    Intereting Posts