Una aplicación que estoy trabajando con está exhibiendo el comportamiento siguiente:¿Alguna sugerencia útil para descubrir dónde se libera la memoria en un proceso de Win32?
Durante una operación de alta de memoria en particular, el uso de memoria del proceso en el Administrador de tareas (Mem Uso stat) alcanza un máximo de aproximadamente 2.5GB (Nota: Se ha configurado una clave de registro para permitir esto, ya que normalmente hay un máximo de 2 GB para un proceso en Windows de 32 bits)
Después de que se completa la operación, el tamaño del proceso comienza a disminuir lentamente en una tasa de 1MB por segundo.
Estoy tratando de encontrar la manera más fácil de determinar rápidamente quién está liberando esta memoria y dónde se está liberando.
Tengo problemas para conectar un generador de perfiles de memoria para mi código, y yo no quiero particularmente para anular los new
/delete
operadores para realizar un seguimiento de las asignaciones/cancelaciones de asignación (OIA, quiero hacer esto sin volver a compilar el código)
¿Alguien puede ofrecer alguna sugerencia útil de cómo podría hacer esto a través del depurador de Visual Studio?
actualización
También debo mencionar que es una aplicación multi-hilo, por lo que la pausa de la aplicación y el análisis de la pila de llamadas a través del depurador no es la opción más deseable. Consideré congelar diferentes hilos de a uno por vez para ver si la memoria deja de reducirse, pero estoy bastante seguro de que esto hará que la aplicación falle.
Qué perfiles ha probado. Es caro, pero he utilizado el comprobador de límites antes para resolver problemas de memoria aparentemente intratables. – rerun
Puede intentar establecer un punto de interrupción en la función de eliminación del tiempo de ejecución.Una forma de llegar: en la parte superior de la línea principal, simplemente haga 'int * i = new int; eliminar i; '. Siga este paso y entre en la línea 'delete i'; debería terminar en la función de eliminación de tiempo de ejecución. Ahora ponga un punto de interrupción allí, (elimine el código int) y ejecute su programa. Cuando tu memoria comience a liberarse, podrás verificar la pila. No voy a poner esto como una respuesta todavía, porque no estoy seguro si esto es lo que estás pidiendo. – GManNickG
@rerun - Usamos Rational Purify, pero no he probado el comprobador de límites. @GMan - Buena idea; Voy a dar una oportunidad. – LeopardSkinPillBoxHat