¿Cómo puedo saber si mi código administrado está perdiendo memoria debido a las llamadas de la biblioteca nativa?

StackOverflow https://stackoverflow.com/questions/244489

Pregunta

Tengo un dll administrado que llama a una biblioteca nativa. Esta biblioteca nativa generalmente devuelve IntPtrs. Se pueden pasar a otros métodos en la biblioteca nativa para hacer cosas, o para decirle a la biblioteca que libere la instancia asociada con el IntPtr. Pero solo algunas de las instancias deben liberarse de esta manera, otras son administradas por la biblioteca. El problema es que la documentación no siempre es clara sobre qué instancias deben liberarse y cuáles no.

Lo que quiero saber es si hay una manera de saber si mi código ha mantenido referencias a alguno de los punteros que deben liberarse, y por lo tanto, se está produciendo una pérdida de memoria.

¿Fue útil?

Solución

La forma más fácil es probablemente usar un perfilador de memoria. Un google rápido mostró un enlace a MemProfiler . He usado esto una vez (como prueba) y pude encontrar lugares donde no estaba desechando correctamente los DirectoryEntries. Estoy seguro de que hay otros, incluido este one de RedGate.

Otros consejos

Uso WinDbg (está disponible aquí ). Su línea de comando funciona, pero proporciona muchos informes buenos que incluyen información sobre la pila, el número de objetos y el tamaño tomado (esto puede ayudar a señalar los elementos que no se están eliminando).

También está la herramienta de diagnóstico de depuración que tiene informes específicos para las fugas de memoria y manejo. Es aquí

Es posible que desee considerar el uso de SafeHandles para envolver los manejadores devueltos desde el código nativo. Proporciona algún valor adicional sobre un IntPtr.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top