¿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?
¿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?
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.
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()
Puede usar herramientas - delegador (si es usuario de Windows). – MastAvalons
delegador - herramienta genial! Memoria Supoort y fugas de GDI, e.t. – z0r1fan
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.
Puede buscar algunas implementaciones BSD de herramientas de administración/perfilado de memoria para ejemplos de código. Por ejemplo http://code.google.com/p/google-perftools/wiki/GooglePerformanceTools
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:
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.
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.
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.
http://stackoverflow.com/questions/1656227/how-does-valgrind-work – stephan
Puede probar mi [depurador de pila] (http://stackoverflow.com/questions/2835416/critique-my-non- intruso-heap-debugger) para empezar ;-) – fredoverflow
No marcaría eso como duplicado, la pregunta 'valgrind' es relevante pero el" cómo implementar el mío "es nuevo. –