2009-06-27 10 views
11

¿Alguien sabe dónde puedo encontrar una herramienta de detección de fugas de memoria para C++ que se puede ejecutar en línea de comandos o como un complemento de Eclipse en Windows y Linux. Me gustaría que sea fácil de usar. Preferiblemente uno que no sobrescribe new(), delete(), malloc() o free(). Algo como GDB si va a estar en la línea de comandos, pero no recuerdo que se use para detectar fugas de memoria. Si hay un marco de prueba de unidades que hace esto automáticamente, sería genial.G ++ herramienta de detección de fugas de memoria multiplataforma

Esta pregunta es similar a otras preguntas (como Memory leak detection under Windows for GNU C/C++) sin embargo, creo que es diferente porque las que piden soluciones específicas de Windows o tienen soluciones que preferiría evitar. Siento que estoy buscando algo un poco más específico aquí. Las sugerencias no tienen que cumplir todos los requisitos, pero la mayor cantidad posible sería agradable.

Gracias.

EDITAR: Dado que esto ha surgido, al "sobrescribir" me refiero a cualquier cosa que requiera #incluir una biblioteca o que de otra forma cambie cómo C++ compila mi código, si lo hace en tiempo de ejecución para que ejecute el código en un entorno diferente no afectará nada que sería genial. Además, desafortunadamente, no tengo una Mac, por lo que cualquier sugerencia es inútil, pero gracias por intentarlo. Mi computadora de escritorio ejecuta Windows (tengo instalado Linux pero mis monitores duales no funcionan) y prefiero no ejecutar Linux en una máquina virtual, aunque ciertamente es una opción. Mi computadora portátil funciona con Linux, así que puedo usar esa herramienta allí, aunque preferiría pegarme a mi escritorio ya que el espacio de la pantalla es excelente para mantener a la vista toda la documentación de diseño y los requisitos sin tener que moverse demasiado en el escritorio .

NOTA: Si bien puedo probar las respuestas, no marcaré una como aceptada hasta que haya intentado la sugerencia y sea satisfactoria.

EDIT2: No me preocupa la compatibilidad multiplataforma de mi código, es una aplicación de línea de comandos que utiliza solo las bibliotecas C++.

Respuesta

10

Valgrind es su best friend. Valgrind tiene un plugin para eclipse. "Lamentablemente" Valgrind no se ejecuta en Windows, pero se ejecuta en Mac OSX, * BSD y Linux, por lo que consideraría que es "multiplataforma". :)

Valgrind "sobrescribe" new/delete/malloc/free pero no durante la compilación (por lo que no tiene que volver a compilar si eso es lo que quiere decir). Interpreta el binario por lo que el rendimiento sufre un poco durante la prueba.

0

Existe la herramienta leaks en MacOS X (no sé si existe en otro lado) y solía usar una herramienta llamada memprof en linux. También hay valgrind que funciona en Linux y es increíblemente impresionante, pero tiene un rendimiento sustancial, y ostensiblemente en los macos pero no lo he probado.

Sin embargo, no estoy al tanto de tales herramientas en Windows.

1

para aplicaciones de 32 bits, valgrind + wine puede ser una solución funcional también para aplicaciones de Windows. Si su aplicación se puede ejecutar en vino sin ningún cambio, ejecutarlo en valgrind + wine funciona bien en mi experiencia (bastante limitada). Dado que su aplicación funciona en Linux, supongo que es probable que su aplicación se ejecute en vino (evita el código específico de Windows que aún no es compatible con el vino).

+0

¿Quiere decir recompilar la aplicación de Windows en * nix usando Wine como la implementación de API? (Solo tengo curiosidad) – olliej

+0

valgrind funciona para x86_64 así como para PowerPC, MIPS, ARM y otras arquitecturas. – LiraNuna

+0

No, me refiero a ejecutar el binario de Windows, sin modificar, en Linux bajo Wine en valgrind. Es por eso que mencioné solo 32 bits: valgrind no puede ejecutar aplicaciones en vino con soporte de 64 bits, y Wine con soporte de 64 bits es experimental (en 64 bits, me refiero a aplicaciones de Windows de 64 bits) –

1

Mientras mencionó que esto no es preferido, el Boehm Garbage Collector se puede utilizar para detectar fugas de memoria. En pocas palabras, si el recolector de basura alguna vez se está ejecutando, generalmente tiene una pérdida de memoria. Es utilizado de esta manera por Mozilla para detectar pérdidas de memoria en Firefox.

1

DUMA es una biblioteca de detección de fugas multiplataforma que utilizo para muchos de mis proyectos. Es bueno porque no tiene que #include ningún encabezado específico de DUMA, sino simplemente enlace en la biblioteca antes de vincular en la libc de su sistema, que contiene las rutinas de asignación de memoria, y después de vincular en libstdC++.

Puede ser un poco complicado de configurar, especialmente cuando se utiliza con proyectos de C++, pero creo que vale la pena el tiempo invertido. Me ha ayudado a encontrar algunas pérdidas de memoria antes de lo que podría no haber descubierto de otra manera, y un caso en el que eliminé una asignación dos veces.

Una nota: es mucho más fácil si construye un archivo estático (creado por defecto en Windows) porque ayuda a reducir los "falsos positivos" que en realidad son causados ​​por tiempos de ejecución con fugas.

0

En las versiones más nuevas de gcc hay algo llamado leak sanitizer. Solo tiene que agregar -fsanitize=leak para compilar el comando. Luego ejecuta su programa normalmente y al final, si hubo alguna fuga, obtendrá un resumen (en la terminal, por supuesto).

Cuestiones relacionadas