requisitos que leak juego game descargar memory memory-leaks

memory - que - ¿Cómo probar las fugas de memoria?



memory leak que es (5)

Tenemos una aplicación con cientos de posibles acciones de usuario y pensamos en cómo mejorar las pruebas de detección de fugas de memoria.

Actualmente, así es como sucede: cuando se prueba manualmente el software, si parece que nuestra aplicación consume demasiada memoria, utilizamos una herramienta de memoria, buscamos la causa y la solucionamos. Es un proceso bastante lento y no eficiente: los problemas se descubren tarde y depende de la buena voluntad de un desarrollador.

¿Cómo podemos mejorar eso?

  • Compruebe internamente que algunas acciones (como "cerrar archivo") recuperan algo de memoria y lo registran.
  • Afirmar el estado de memoria dentro de nuestras pruebas de unidad (pero parece que esto sería una tarea tediosa)?
  • ¿Manualmente lo revisa regularmente de vez en cuando?
  • Incluya ese cheque cada vez que se implemente una nueva historia de usuario?

¿Cual idioma?

Utilizaría una herramienta como Valgrind, trataré de ejercitar completamente el programa y veré qué informa.


En mi compañía, hemos programado una ruta de acción infinita para nuestra aplicación. El recolector de basura de Java debe limpiar todos los mapas no utilizados y la lista y algo así. Así que dejamos que la aplicación comience con la ruta de acción sin fin y observemos si el tamaño de uso de memoria está creciendo.

La comprobación de qué campos no se eliminan puede usar JProfiler para Java.


primera línea de defensa:

  • lista de verificación con errores relacionados con la asignación de memoria común para desarrolladores
  • directrices de codificación

segunda línea de defensa:

  • revisiones de código
  • análisis de código estático (como parte del proceso de compilación)
  • herramientas de perfilado de memoria

Si trabaja con un lenguaje no administrado (como C / C ++) puede descubrir de manera eficiente la mayoría de las pérdidas de memoria secuestrando funciones de administración de memoria. Por ejemplo, puede rastrear todas las asignaciones / desasignaciones de memoria.


Me parece que el núcleo del problema no es tanto encontrar pérdidas de memoria como saber cuándo probarlas. Dice que tiene muchas acciones de usuario, pero no dice qué secuencias de acciones de usuario son significativas. Si puedes generar secuencias significativas al azar, discutiría mucho para las pruebas aleatorias. En pruebas aleatorias medirías

  • Cobertura del código (con gcov o valgrind )
  • Uso de memoria (con valgrind )
  • Cobertura de las acciones del usuario en sí

Por "cobertura de acciones del usuario" quiero decir declaraciones como las siguientes:

  • Para cada par de acciones A y B, si hay una secuencia significativa de acciones en la cual A es seguida inmediatamente por B, entonces hemos probado dicha secuencia.

Si eso no es cierto, entonces puede preguntar qué fracción de pares A y B es verdadera.

Si tiene los ciclos de CPU para permitírselo, probablemente también se beneficie al ejecutar valgrind u otra herramienta de verificación de memoria antes de cada compromiso con su repositorio de código fuente o durante una compilación nocturna.

¡Automatizar!


Reemplace nuevo y elimine con sus versiones personalizadas y registre cada acto de asignación / desasignación.

Hablando en general (no sobre pruebas, sino para combatir el problema en su origen), los smartpointers ayudan a evitar este problema. Afortunadamente, el estándar C ++ 11 proporciona nuevas clases de punteros inteligentes convenientes ( shared_ptr , unique_ptr ).