2010-05-18 18 views
10

¿Cómo funcionan las herramientas de detección de fugas de memoria como purify y valgrind?Herramienta para detectar fugas de memoria

¿Cómo puedo diseñar e implementar mi propia herramienta?

+1

http://stackoverflow.com/questions/1656227/how-does-valgrind-work – stephan

+1

Puede probar mi [depurador de pila] (http://stackoverflow.com/questions/2835416/critique-my-non- intruso-heap-debugger) para empezar ;-) – fredoverflow

+0

No marcaría eso como duplicado, la pregunta 'valgrind' es relevante pero el" cómo implementar el mío "es nuevo. –

Respuesta

5

Para la detección básica de fugas, solo tiene que conectar las rutinas de asignación de memoria de bajo nivel, p. parcheando malloc/free. A continuación, realiza un seguimiento de todas las asignaciones y, posteriormente, informa de las que no se han liberado en un punto apropiado, p. justo antes de salir.

8

Tales herramientas generalmente instrumento el exeutable con su propio código. por ejemplo, reemplazan cada llamada a malloc() y free() con sus propias funciones, lo que les permite seguir cada asignación.

En Visual Studio esto puede hacerse automáticamente utilizando sólo la biblioteca de tiempo de ejecución C utilizando las funciones de la familia de _CrtDumpMemoryLeaks()

+2

Puede usar herramientas - delegador (si es usuario de Windows). – MastAvalons

+2

delegador - herramienta genial! Memoria Supoort y fugas de GDI, e.t. – z0r1fan

3

Para el trabajo real, valgrind funciona bastante bien. Detecta fugas de lectura/escritura no válidas y de memoria.

Para proyectos de hobby, puede crear su propio módulo de administración de memoria que realiza un seguimiento de la asignación de varios punteros y su uso. Si no ve que se está utilizando una ubicación de memoria durante mucho tiempo, podría ser una pérdida.

1

Estoy desarrollando esta herramienta: Deleaker.

Claro, la idea obvia es enganchar todas las funciones que hacen asignaciones y desasignaciones. Eso no solo es malloc y gratuito, sino HeapAlloc/HeapFree (si hablamos de la plataforma Windows) porque las versiones modernas de VC++ (después de VC 6.0) simplemente redirigen malloc/free a HeapAlloc/HeapFree de winapi.

Para cada asignación, se guarda una pila y se guarda un objeto. En cada desasignación, el objeto se libera. A primera vista, es muy simple: simplemente almacene una lista de objetos asignados y elimine un objeto en el enlace de desasignación.

pero hay partes difíciles:

  • velocidad

que necesita para mantener una lista de objetos asignados. Si agrega/quita un objeto en cada función enganchada, el proceso se está ejecutando toooo slooow. Ese parece ser un problema común de tales herramientas.

  • Seguimiento de la pila

Usando dbghelp.dll función para obtener seguimiento de la pila lleva mucho tiempo. Debe obtener las entradas de la pila más rápido, por ejemplo, mediante la lectura manual de la memoria de proceso.

  • Los falsos positivos

Algunas fugas se producen por DLL del sistema. Si los muestra a todos, obtiene un montón de fugas, pero el usuario no puede "resolverlo": no tiene acceso a su código fuente y no puede evitar la ejecución de este código.Es imposible detener estas filtraciones. Algunos de ellos son asignaciones únicas en el punto de entrada de un dll del sistema, por lo que no es una fuga real (una buena pregunta, ¿cuál es la fuga en absoluto?). ¿Cómo reconocer esas filtraciones que deben mostrarse? Un buen filtrado es una respuesta.

Espero que esto ayude.

Cuestiones relacionadas