c++ xcode memory-leaks macos instruments

c++ - Comprobación de fuga de memoria con instrumentos en Mac



xcode memory-leaks (3)

Acabo de tirarme de los pelos tratando de hacer que los instrumentos escupieran mis fugas de memoria deliberadamente construidas. Mi ejemplo de prueba se ve así:

class Leaker { public: char *_array; Leaker() { _array=new char[1000]; } ~Leaker() { } }; void *leaker() { void *p=malloc(1000); int *pa=new int[2000]; { Leaker l; Leaker *pl=new Leaker(); } return p; } int main (int argc, char **argv) { for (int i=0; i<1000; ++i) { leaker(); } sleep(2); // Needed to give Instruments a chance to poll memory return 0; }

Básicamente, los instrumentos nunca encontraron las fugas obvias. Me estaba volviendo loco sobre por qué, pero luego descubrí "sec Entre detecciones automáticas" en el panel "Configuración de fugas" debajo del panel Fugas. Lo marqué lo más bajo posible, que fue de 1 segundo, y puse el sueño (2) en mi código, y listo; ¡Se encontraron fugas!

En lo que a mí respecta, una fuga es una fuga, independientemente de si ocurre 30 minutos en una aplicación o 30 milisegundos. En mi caso, despojé el caso de prueba del código anterior, pero mi aplicación real es una aplicación de línea de comandos sin UI ni nada, y funciona muy rápido; ciertamente menos que el intervalo predeterminado de muestra de 10 segundos.

Ok, entonces puedo vivir con un par de segundos al salir de mi aplicación en modo de instrumentación, pero lo que REALMENTE quiero es simplemente tener memoria de instantáneas de Instruments al salir, luego hacer lo que necesite con el tiempo mientras la aplicación se está ejecutando.

Entonces ... la pregunta es: ¿hay alguna forma de hacer que la memoria instantánea de Instruments salga de una aplicación, independientemente del intervalo de muestreo?

Aclamaciones,

Shane


Los instrumentos, en el modo Fugas, pueden ser realmente potentes para el rastreo de fugas, pero he descubierto que es más parcial hacia las aplicaciones GUI basadas en eventos que los programas de línea de comandos (particularmente aquellos que salen después de un corto tiempo). Solía ​​haber una API de CHUD donde podías controlar mediante programación aspectos de la instrumentación, pero la última vez que lo intenté, los marcos ya no se proporcionaban como parte del SDK. Tal vez parte de esto ahora se reemplaza con Dtrace .

Además, asegúrese de estar al día con Xcode ya que hubo algunas mejoras recientes en esta área que podrían facilitarle hacer lo que necesita. También puede mantener el breve retraso antes de la salida, pero condicionarlo a la presencia de una variable de entorno, y luego establecer esa variable de entorno en las propiedades de inicio de Instruments para su aplicación, de modo que la ejecución fuera de Instruments no tenga el retraso.


Decidí dejar la demora de 2 segundos durante mi depuración y generación de fugas.


La mayoría del código de prueba de la unidad ejecuta las rutas y salidas del código deseado. Aunque esto es perfectamente normal para las pruebas unitarias, crea un problema para la herramienta de fugas, que necesita tiempo para analizar el espacio de memoria del proceso. Para solucionar este problema, debe asegurarse de que su código de prueba de unidad no se cierre inmediatamente después de completar sus pruebas. Puede hacer esto poniendo el proceso a dormir indefinidamente en lugar de salir normalmente.

https://developer.apple.com/library/ios/documentation/Performance/Conceptual/ManagingMemory/Articles/FindingLeaks.html