Pasé los últimos días tratando de encontrar pérdidas de memoria en un programa que estamos desarrollando.Ayuda con comportamiento de memoria extraño. Buscando filtraciones tanto en mi cerebro como en mi código
En primer lugar, traté de usar algunos detectores de fugas. Después de solucionar algunos problemas, ya no encuentran fugas. Sin embargo, también estoy monitoreando mi aplicación usando perfmon.exe
. El Monitor de rendimiento informa que "Bytes privados" y "Conjunto de trabajo - Privado" aumentan constantemente cuando se utiliza la aplicación. Para mí, esto sugiere que el programa está usando más y más memoria cuanto más tiempo se ejecute. Sin embargo, los recursos internos parecen ser estables, así que esto suena como una filtración hacia mí.
El programa está cargando una DLL en tiempo de ejecución. Sospecho que estas filtraciones o lo que sea que ocurran en esa biblioteca se purgan cuando la biblioteca está descargada, por lo tanto, no serán detectadas por los detectores de fugas. Utilicé DevPartner BoundsChecker y Virtual Leak Detector para buscar fugas de memoria. Ambos supuestamente detectan fugas en las DLL.
Además, el consumo de memoria está aumentando en pasos y esos pasos aproximadamente, pero no exactamente, coinciden con ciertas acciones de la GUI que realizo en la aplicación. Si se tratara de errores en nuestro código, deberían activarse cada vez que se realizan las acciones y no solo la mayor parte del tiempo.
Cada vez que me enfrento con tanta extrañeza, comienzo a cuestionar mis suposiciones básicas. Entonces me dirijo a ustedes, que lo saben todo, por sugerencias. ¿Hay algún defecto en mis suposiciones? ¿Tiene una idea de cómo solucionar un problema como este?
Editar:
Actualmente estoy usando Microsoft Visual C++ (x86) en Windows 7 64.
Edit2:
simplemente utilicé IBM Purificar a la caza de fugas. En primer lugar, enumera un 30% completo del programa como memoria filtrada. Esto no puede ser cierto. Supongo que es identificar toda la DLL como filtrada o algo así. Sin embargo, si busco nuevas fugas cada pocas acciones, informa las fugas que corresponden con el aumento de tamaño informado por el Monitor de rendimiento. Esto podría ser una causa de una fuga. Lamentablemente, solo estoy usando la versión de prueba de Purify, por lo que no me mostrará la ubicación real de esas filtraciones. (Estas fugas solo aparecen durante el tiempo de ejecución. Cuando el programa sale, no hay fugas de ninguna herramienta)
Que sea simplemente la fragmentación del montón? – sharptooth
@sharptooth: Posiblemente. No lo sé. ¿Cómo me enteraría? ¿No debería Windows o el compilador hacerse cargo de la fragmentación del montón? – bastibe
La fragmentación del montón no es tan fácil: http://stackoverflow.com/q/1588922/57428 – sharptooth