Valgrind en Mac OS Snow Leopard

Mac OS X 10.6 Snow Leopard

Valgrind es una herramienta que permite ejecutar análisis dinámicos sobre la ejecución de otros programas, pudiendo por ejemplo permitirnos depurar el uso de la memoria de un programa, pudiendo detectar los insidiosos memory leaks (memoria no liberada) de nuestro código fuente.

Esta herramienta es de amplio uso en Linux, pero la versión actual no compila en la última edición de Mac OS Snow Leopard.



Esta entrada trata de cubrir el hueco abierto hasta que la rama principal de desarrollo de Valgrind lo cubra.

A continuación os enumero los sencillos pasos para obtener, compilar, instalar y probarlo todo:

Obtener fuentes y parche

Obtenemos los fuentes:


svn co svn://svn.valgrind.org/valgrind/tags/VALGRIND_3_5_0 valgrind
cd valgrind

Obtenemos y aplicamos el parche que hace compilar Valgrind en Snow Leopard:


curl http://bugsfiles.kde.org/attachment.cgi?id=36999 > 10.6.patch
patch -p0 < 10.6.patch

Compilar

Autogeneramos el código:


./autogen.sh

Ahora configuramos los fuentes, eligiendo 1 de las 2 líneas, dependiendo si tenemos procesador de 32 bits o de 64:


./configure
./configure --build=amd64-darwin

Compilamos:


make

Instalar

Finalmente instalamos con permisos de super usuario:


sudo make install

Prueba

Editamos un fichero de prueba (demo.cpp)con nuestro editor favorito (vim demo.cpp):


#include

int main ()
{
malloc (100);
return (0);
}

Ahora compilemos con opción de depuración (-g):


gcc -g demo.cpp -o demo

Ejecutamos el programa generado demo mediante Valgrind, con la opción de informe de memory leaks habilitado:


valgrind --leak-check=full ./demo

El resultado de la ejecución del ejemplo es el siguiente:


==32308== Memcheck, a memory error detector
==32308== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==32308== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info
==32308== Command: ./demo
==32308==
==32308==
==32308== HEAP SUMMARY:
==32308== in use at exit: 188 bytes in 2 blocks
==32308== total heap usage: 2 allocs, 0 frees, 188 bytes allocated
==32308==
==32308== 100 bytes in 1 blocks are definitely lost in loss record 2 of 2
==32308== at 0x10000FD72: malloc (vg_replace_malloc.c:195)
==32308== by 0x100000F15: main (demo.cpp:5)
==32308==
==32308== LEAK SUMMARY:
==32308== definitely lost: 100 bytes in 1 blocks
==32308== indirectly lost: 0 bytes in 0 blocks
==32308== possibly lost: 0 bytes in 0 blocks
==32308== still reachable: 88 bytes in 1 blocks
==32308== suppressed: 0 bytes in 0 blocks
==32308== Reachable blocks (those to which a pointer was found) are not shown.
==32308== To see them, rerun with: --leak-check=full --show-reachable=yes
==32308==
==32308== For counts of detected and suppressed errors, rerun with: -v
==32308== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

Es obvio que la reserva de memoria que hicimos con malloc ha sido descubierta.

2 comentarios

  1. onocom dice: Responder

    Perdón, realmente quería decir así:

    curl ‘http://bugsfiles.kde.org/attachment.cgi?id=36999’ > 10.6.patch

  2. onocom dice: Responder

    Gracias, ha sido un post muy útil para mi.
    Aunque sólo conseguí que el curl funcionara poniendo la URL entre comillas simples.

    ‘curl http://bugsfiles.kde.org/attachment.cgi?id=36999‘ > 10.6.patch

    Salu2

Deja un comentario