2008-09-10 32 views
30

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

Aquí se presenta un resumen de las respuestas hasta el momento:

Valgrind - Instrumentación marco para la construcción de herramientas de análisis dinámicos.

Electric Fence - Una herramienta que trabaja con el BGF

Splint - Anotación-Assisted Ligera estática Comprobación

Glow Code - Se trata de un completo rendimiento y la memoria de perfiles en tiempo real para los programadores de Windows y .NET que desarrollan aplicaciones con C++, C# o cualquier .NET Framework

Ver también stackoverflow post.

Respuesta

11

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

1

He tenido un amor mínimo por los detectores de fugas de memoria. Por lo general, hay demasiados falsos positivos para que sean de alguna utilidad. Yo recomendaría estos dos como beiong al menos intrusiva:

GlowCode

Debug heap

2

pelusa (herramienta de código abierto muy similar llamado splint)

+1

Especialmente la férula no se trata tanto de fugas. – 0xC0000022L

2

doloroso, pero si tuviera que utilizar uno ..
lo recomiendo la suite DevPartner BoundsChecker .. eso es lo que la gente en mi uso del lugar de trabajo para este fin. Pagado n propietario ... no freeware.

+0

He usado BoundsChecker yo mismo. Ha sido * increíblemente útil, tanto para fugas de memoria como para otros tipos de pérdidas de recursos. – Herms

0

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

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

-1

Voy a poner en segundo lugar la valgrind como una herramienta externa para las 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é utilizar ya el código cuando se puede escribir su propio :)

I broma, pero a veces se necesita algo simple y es más rápido para escribir usted mismo escrito. Normalmente solo reemplazo las llamadas a malloc() y free() con funciones que mantienen mejor la pista 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 lo sabía, 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.

1

Win32 Para la depuración de las pérdidas de memoria que he tenido muy buenas experiencias con el viejo y simple CRT montón de depuración, que viene como un lib con Visual C

En un malloc depuración de construcción (y otros) se redefina 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 me jugaban 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!).

0

El abuelo de estas herramientas es el, de código cerrado herramienta comercial Purify, que se vendió a IBM y luego a UNICOM

Insure++ (código fuente) Instrumentación de Parasoft y valgrind (open source) son los dos otros bienes competidores.

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

3

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.

+1

¿Qué hace Purify que Valgrind no hace? La última vez que probé Purify, me costó muchísimo configurarlo y sacarle provecho, además de que tenías que compilar usando su compilador. Valgrind usa tu compilación de depuración normal. – florin

+0

Tenga en cuenta que purificar se ha vendido a UNICOM Systems http://unicomsi.com/products/purifyplus/ – djsadinoff

3

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

-fmudflap -lmudflap 

a sus banderas de gcc.

+0

Para los usuarios en el futuro, este ya no es el caso. Las banderas no hacen nada de acuerdo con el enlace. En su lugar use Address Sanitizer. – UndyingJellyfish

1

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.

2

También vale la pena usarlo si está en Linux usando glibc es el código de pila de depuración incorporado. Para usarlo, enlazar con -lmcheck o definir (y exportación) la variable ambiente MALLOC_CHECK_ con el valor 1, 2, o 3. The glibc manual provides more information.

Este modo es más útil para la detección de dobles libera, y se a menudo encuentra escrituras fuera del área de memoria asignada cuando hace un libre. No creo que reporte la memoria filtrada.

-1

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.

2

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

+0

+1 para cppcheck: no se utiliza, por lo que se verá; la recomendación importante es el análisis estático – Andrew

0

Nadie mencionó clang's MSan, que es bastante potente. Sin embargo, oficialmente solo es compatible con Linux.

0

Esta pregunta puede ser antigua, pero la responderé de todas formas, 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/

de Windows 32 & plataformas de 64 bits son compatibles, callstacks modo nativo y mixtos son compatibles.

. 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).

Manual completo se puede encontrar aquí:

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

No tenga miedo de lo mucho que realmente detecta fugas de TI de su proceso. Captura fugas de memoria de todo el proceso. Analice solo las fugas mayores, no todas.