c debugging memory memory-leaks

Detectores de fugas de memoria para C?



debugging memory (17)

Doloroso, pero si tuviera que usar uno ...
Recomiendo la suite DevPartner BoundsChecker ... eso es lo que las personas en mi lugar de trabajo usan para este propósito. Pagado n propietario ... no freeware.

¿Con qué detectores de fuga de memoria la gente ha tenido una buena experiencia?

Aquí hay un resumen de las respuestas hasta el momento:

Valgrind - Marco de instrumentación para construir herramientas de análisis dinámico.

Cerca eléctrica : una herramienta que funciona con GDB

Splint - Comprobación estática liviana asistida por anotación

Glow Code : este es un perfil completo de rendimiento y memoria en tiempo real para programadores de Windows y .NET que desarrollan aplicaciones con C ++, C # o cualquier .NET Framework

También vea esta publicación stackoverflow .


El abuelo de estas herramientas es la herramienta purificada comercial de unicomsi.com/products/purifyplus , que se vendió a IBM y luego a UNICOM.

Parasoft''s Insure++ (instrumentación de código fuente) y valgrind (código abierto) son los otros dos competidores reales.

Trivia: el autor original de Purify, Reed Hastings, fue a fundar NetFlix.


En Windows, he usado Visual Leak Detector . Se integra con VC ++, es fácil de usar (solo incluya un encabezado y establezca LIB para encontrar la lib), fuente abierta, libre de usar FTW.


En la universidad, cuando estaba haciendo la mayoría de las cosas en Unix Solaris, usé gdb .

Sin embargo, me gustaría ir con Valgrind en Linux.


Esta pregunta puede ser antigua, pero la responderé de todos modos, tal vez mi respuesta ayude a alguien a encontrar las pérdidas de memoria.

Este es mi propio proyecto, lo he puesto como código fuente abierto:

https://sourceforge.net/projects/diagnostic/

Se admiten plataformas Windows de 32 y 64 bits, se admiten callstacks nativos y de modo mixto.

La recolección de basura .NET no es compatible. (C ++ cli''s gcnew o C # ''s new)

Es una herramienta de alto rendimiento, y no requiere ninguna integración (a menos que realmente desee integrarlo).

El manual completo se puede encontrar aquí:

http://diagnostic.sourceforge.net/index.html

No tengas miedo de lo mucho que realmente detecta, pierde tu proceso. Captura fugas de memoria de todo el proceso. Analice solo las fugas mayores, no todas.


He tenido un amor mínimo por cualquier detector de fuga de memoria. Por lo general, hay demasiados falsos positivos para que sean de alguna utilidad. Yo recomendaría que estos dos sean los menos intrusivos:

GlowCode

Pila de depuración


Nadie mencionó el MSan de clang , que es bastante poderoso. Sin embargo, oficialmente solo es compatible con Linux.


Nuestra herramienta CheckPointer puede hacer esto para GNU C 3/4 y, MS dialectos de C y GreenHills C. Puede encontrar problemas de gestión de memoria que Valgrind no puede.

Si su código simplemente tiene fugas, al salir, CheckPointer le dirá dónde se asignó toda la memoria sin actualizar.


Para la depuración de Win32 de fugas de memoria, he tenido muy buenas experiencias con el viejo y sencillo CRT Debug Heap, que viene como una lib con Visual C.

En una compilación Debug malloc (et al) se redefine como _malloc_dbg (et al) y hay otras llamadas para recuperar resultados, que no están definidas si _DEBUG no está configurado. Establece todo tipo de guardias de límites en el montón, y le permite mostrar los resultados en cualquier momento.

Tuve algunos falsos positivos cuando tenía algunas rutinas de tiempo que interferían con las asignaciones de tiempo de ejecución de la biblioteca hasta que descubrí _CRT_BLOCK.

Tuve que producir primero DOS, luego consola de Win32 y servicios que se ejecutarían para siempre. Hasta donde sé, no hay pérdidas de memoria, y en al menos un lugar, el código se ejecutó durante dos años sin supervisión antes de que el monitor de la PC fallara (¡aunque la PC estaba bien!).


Si tiene el dinero: IBM Rational Purify es un detector de fuga de memoria y corrupción de memoria de potencia industrial extremadamente potente para C / C ++. Existe para Windows, Solaris y Linux. Si solo tienes Linux y quieres una solución económica, elige Valgrind.


También vale la pena usarlo si estás en Linux usando glibc es el código de pila de depuración incorporado. Para usarlo, establezca un enlace con -lmcheck o defina (y exporte) la variable de entorno MALLOC_CHECK_ con el valor 1, 2 o 3. El manual de glibc proporciona más información.

Este modo es más útil para detectar doble frecuencia, y a menudo encuentra escrituras fuera del área de memoria asignada cuando realiza una operación gratuita. No creo que reporte la memoria filtrada.


Tuve bastante éxito con cppcheck , que solo hace análisis estáticos. Es de código abierto y tiene una interfaz de línea de comando (no lo usé de ninguna otra manera).


Voy a secundar el valgrind como una herramienta externa para pérdidas de memoria.
Pero, para la mayoría de los problemas que he tenido que resolver, siempre he usado herramientas internas. Algunas veces, las herramientas externas tienen demasiada carga o son demasiado complicadas de configurar.

¿Por qué usar código ya escrito cuando puedes escribir el tuyo? :)

Bromeo, pero a veces necesitas algo simple y es más rápido escribirlo tú mismo. Por lo general, simplemente reemplazo las llamadas a malloc () y free () con funciones que hacen un mejor seguimiento de quién asigna qué. La mayoría de mis problemas parecen ser que alguien se olvidó de liberarlos y esto ayuda a resolver ese problema.

Realmente depende de dónde está la fuga, y si supiera eso, entonces no necesitaría ninguna herramienta. Pero si tiene alguna idea de dónde cree que está goteando, instale su propia instrumentación y vea si eso lo ayuda.


pelusa (herramienta de código abierto muy similar llamada Splint )



Mudflap para gcc! En realidad compila los cheques en el ejecutable. Solo agrega

-fmudflap -lmudflap

a sus banderas gcc.


Valgrind en Linux es bastante bueno; No tengo experiencia en Windows con esto.