Lihuen
RSSRSS AtomAtom

Diferencia entre revisiones de «Cómo usar GDB»

(Página creada con «==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 ...»)
 
Línea 3: Línea 3:
  
 
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.
 
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==
 
==Instalación==
Línea 9: Línea 11:
 
  ~#apt-get install gdb
 
  ~#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.
 
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?
 +
 +
 +
 +
 +
[[Category:Documentación]]
 +
[[Category:Desarrollo]]
 +
 +
 +
{{Contacto}}

Revisión de 15:02 6 ago 2012

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