Lihuen
RSSRSS AtomAtom

Cómo usar GDB

Introducción

Aquellos que desarrollan en C, conocen de las dificultades a las que se enfrenta cuando trata de depurar un programa, que por ejemplo, por qué no se agrega un nodo a una lista o por qué no se copia determinado string. GDB (Gnu Project Debugger) es una herramienta que permite entre otras cosas, correr el programa con la posibilidad de detenerlo cuando se cumple cierta condición, avanzar paso a paso, analizar que ha pasado cuando un programa se detiene o cambiar algunas cosas del programa como el valor de las variables.

GDB es una herramienta muy poderosa que nos ayudará a encontrar esos errores difíciles, por ejemplo cuando los punteros no apuntan a donde estamos pensando. Si bien este tutorial está pensado para el lenguaje C, probablemente también sirva para depurar programas en Fortran o C++ con los mismos comandos o similares.

DESCARGO: Este no es un tutorial de programación en C. Muchas de las cosas aquí explicadas, sobre todo en el código de muestra, no necesariamente estén correctas. Solo se escribieron de la forma en que se escribieron a fin de mostrar alguna determinada característica de GDB.

Instalación

GDB no viene en Lihuen por lo que es necesario instalarlo desde los repositorios. Esto se puede hacer utilizando una interfaz gráfica como Synaptic, instalando el paquete gdb o desde la consola como superusuario, ejecutando los siguientes comandos:

~#apt-get update
~#apt-get install gdb

Una vez instalado el programa, ya está listo para funcionar. GDB funciona desde la terminal y si bien existen interfaces gráficas como ddd y xxgdb, el funcionamiento de las mismas no se cubre en este tutorial. Para ejemplificar el uso de GDB utilizaremos algunos sniplets de código C, en particular de una lista genérica.

Comenzando

Los archivos de ejemplo pueden descargarse aquí. Permanentemente estaré haciendo referencia a los archivos aquí contenidos.

En el primer ejemplo haremos referencia al archivo lista1.c. Para compilar, se puede correr el siguiente comando:

~$ gcc -o lista lista1.c -std=c99 -Wall -DTEST --debug

El parámetro -DTEST define la macro TEST para que se incluya la función main, que permite testear la funcionalidad de la lista. El parámetro --debug agrega símbolos de depuración, importantes a la hora de utilizar GDB.

Para correr el programa simplemente ejecutamos:

~$ ./lista

La salida debería ser algo así:

 Pregunto si la lista sin inicializar es vacía.
No es vacía
No es vacía, así que trato de imprimir el contenido del nodo...
Violación de segmento

El problema que tiene este programa es que utiliza la lista sin crearla, por lo que, tanto l, l->dato y l->sig son diferentes de NULL. El problema es obvio y el error grosero (otros son mucho más sutiles) pero ¿cómo nos ayuda GDB a darnos cuenta?


 Ante cualquier duda o inconveniente no dudes en visitar nuestros foros.
 http://lihuen.linti.unlp.edu.ar/foros