Una de las funcionalidades más interesantes de valgrind es la posibilidad de ejecutar un depurador como el gdb cuando encuentra un error. De esta manera, se puede ver exactamente la línea donde se ha producido y podemos estudiar el estado del programa.
En Linux es muy sencillo hacerlo y basta con ejecutar el programa con el parámetro --db-attach=yes. Cuando valgrind detecte un error, nos preguntará si queremos ejecutar el depurador. Esta opción no funciona correctamente en MacOS X, al menos en la versión 3.7.0 que compilé.
A continuación puede verse un ejemplo de la ejecución de valgrind interrunpida por un ^C esperando instrucciones para ejecutar el depurador:
==9133== Memcheck, a memory error detector
==9133== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==9133== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==9133== Command: ./comando_prueba
==9133==
^C==9133==
==9133== ---- Attach to debugger ? --- [Return/N/n/Y/y/C/c] ----
En este caso, N o n no ejecutará nada, Y o y ejecutará el depurador y C o c parará la ejecución del programa
Otra opción para conectar el gdb y el valgrind es implementar la funcionalidad de gdb server que hay en valgrind. No se puede depurar directamente un binario, puesto que lo que hace valgrind es usar una CPU virtual y va analizando los resultados. Con ayuda de esta funcionalidad, podemos conectarnos desde un gdb y depurar el programa. Esta manera de usar el depurador si funciona bajo MacOS X.
- Ejecutar valgrind con los parámetros --vgdb=yes y --vgdb-error=1. Esto hará que se active el gdbserver y que valgrind para la ejecución del programa cuando encuentre un error. Si el parámetro --vgdb-error=0, entonces empezará con el progrma detenido y habrá que controlarlo con el gdb.
- Ejecutar el programa vgdb que se instala con el valgrind. Le pasamos como parámetro --port=puerto donde puerto es el puerto TCP donde se va a conectar el gdb. Una cosa importante, en caso de tener más de una instancia de valgrind corriendo, hay que especificar el PID del proceso , cosa que puede hacerse con el parámetro --pid.
- Ejecutar el gdb, especificando el binario que está ejecutándose bajo valgrind y conectarse al depurador remoto. Eso se hace con la orden de gdb target remote IP:puerto. Por ejemplo, si está en la máquina local en el puerto 1234, en en gdb habría que intruducir la orden:
(gdb) target remote 127.0.0.1:1234
A partir de aquí, podemos controlar el programa con las órdenes del gdb.
No hay comentarios:
Publicar un comentario