Detectar fugas de memoria en C y C++

Las fugas de memoria es uno de los problemas mas comunes de los lenguages de programación C y C++, ya que el uso de la memoria dinámica recae sobre el programador. Detectar este tipo de errores generalmente es una tarea tediosa, complicada y bastante poco agradecida.

Afortunadamente bajo la plataforma Linux, existe la herramienta Valgrind. Esta herramienta es capaz de detectar automáticamente los errores derivados de un mal uso de la memoria dinámica.

Para poder usar Valgrind hay que compilar el programa (en C usando gcc y en C++ usando g++) especificando la opción -g. Por ejemplo:

 g++ -g Mi_programa.cpp -o Mi_programa

Esta opción introduce información extra de debbuging en el ejecutable. Esta información extra podrá ser utilizada por otras herramientas como GDB o Valgrind para encontrar errores. Posteriormente se debe ejecutar en un terminal la sentencia:

valgrind --leak-check=full Mi_programa argumento1 argumento2 ... argumentoN

Para mas información sobre que significa cada elemento generado en la salida de la herramienta Valgrind, puede consultar el manual de usuario oficial, o bien esta guía de referencia rápida.

Para mi la forma mas sencilla de usar Valgrind es embebiendo las órdenes en un script de Linux. De esta forma evito el tener que recordar las distintas opciones del programa. El script puede ser similar al siguiente:

#!/bin/bash
#Compilar usando:
#g++ -g ($1).cpp -o $1

case "$#" in
	    2)
		valgrind --leak-check=yes ./executable $1 $2 ;;
	    3)
		valgrind --leak-check=yes ./executable $1 $2 >> $3 2>> $3 ;;
	    *)
		echo "Debe hacer la llamada de la forma: ./memory_leaks.sh argumento1 argumento2 [Archivo_salida]" ;;
	esac

Para el script de ejemplo el programa se llama executable y tanto $1 como $2 son los argumentos que se le pasan al programa. La variable $3 contiene el nombre de archivo donde se almacenará la salida generada por Valgrind, ya que en determinadas ocasiones la salida es demasiado larga y no se puede visualizar en su totalidad en el terminal.

Acerca de franciscoguemes

Ingeniero en Informática
Esta entrada fue publicada en C/C++, Linux. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s