Es un depurador portable que se puede utilizar en varias plataformas Unix y funciona para varios lenguajes de programación como C, C++ y Fortran. GDB fue escrito por Richard Stallman en 1986. GDB es software libre distribuido bajo la licencia GPL.
GDB ofrece la posibilidad de trazar y modificar la ejecución de un programa. El usuario puede controlar y alterar los valores de las variables internas del programa.
GDB no contiene su propia interfaz gráfica de usuario y por defecto se controla mediante una interfaz de línea de comandos. Existen diversos front-ends que han sido diseñados para GDB, como Data Display Debugger, GDBtk/Insight y el «modo GUD» en Emacs.
En la ayuda del gdb se refieren al programa a depurar como inferior, por lo que cuando se tope con este término en busquedas o en la documentación, se está refiriendo al programa al que se le va a hacer Debug.
Muchos de los comandos gdb tienen abreviaciones, por ejemplo, "p" es la abreviación del comando "print". Para indicar cual es la abreviación del comando, se va a colocar entre paréntesis al lado del nombre del comando.
Para ejecutar el gdb, debemos ubicarnos en el directorio donde está el ejecutable a ser sometido al Debugging, y estando en ese directorio se debe ejecutar:
gdb -tui <ejecutable>
La opción "-tui" activa la interface de Usuario, la que muestra la pantalla dividida en dos secciones (y puede ser ampliada a más), mostrando el código fuente y el interprete de comandos.
Lo primero que se debe saber de gdb es como iniciar un programa, como detenerlo y los diferentes modos de ejecución.
run (r) <parametros> : inicia la ejecución del Debug del programa. Esto quiere decir que se va a ejecutar hasta el final del programa o hasta encontrar un Breakpoint. Se debe indicar luego del run todos los parametros que consume el programa.
step (s) : Una vez alcanzado un Breakpoint, se puede ejecutar este comando para ejecutar la linea actual (donde se encuetra detenido el programa). Esto implica que únicamente se va a ejecutar la linea actual y ninguna otra, y el cursor del programa se va a ubicar en la linea de más abajo. Si la ejecución de la linea es la llamada a una función, gdb va a invocar a dicha función sin ir a la implementación de la misma.
next (n): Funciona de manera similar a step, ejecuta únicamente la linea de código en donde está detenido el cursor, con la diferencia que si la ejecución de dicha linea es una llamada a una función, gdb va a ir a la primera linea dentro de la definición de la función (en lugar de solamente llamar la función y retornar su valor).
continue (c): Reinicia la ejecución del Debug del programa. es decir, que si estamos detenidos en una linea en particular, con esta instrucción estamos indicando que se continúe con el Debug del programa hasta el final o hasta encontrar un Breakpoint.
quit (q): Termina la ejecución del gdb, y por lo tanto, finaliza el Debug que se está haciendo sobre el ejecutable.
Después de saber iniciar el programa, es necesario aprender como colocar Breakpoint, como quitarlos, como ver el contenido de las variables, inclusive como asignarle un valor a una variable durante el proceso de Debug.
break <numero_linea> (b): Establece un Breakpoint (o punto de parada) en la ejecución del programa. Debido a la importancia de este punto lo detallaremos más adelante.
info breakpoints: Muestra todos los Breakpoint agregados al programa.
clear <numero_linea>: sirve para remover un Breakpoint en una linea determinada. Ejemplo: "clear 45" remueve el Breakpoint ubicado en la linea 45.
delete <numero_breakpoint>: sirve para remover un Breakpoint por su número. Ejemplo: "delete 1" remueve el Breakpoint número 1 (el primer Breakpoint agregado al programa).
print <nombre_variable> (p): Muestra el contenido de una variable, una posición en un array, el resultado de una función sobre una variable, entre otros.
set var <nombre_variable=valor>:Asigna el valor que va a tener una variable. A partir de que se asigna el valor de la variable, el programa va a continuar su ejecución considerando el valor recién asignado.
Utilizado para imprimir el valor que tiene una variable en un momento dado de la ejecución.
En algunos casos, cuando el string sea muy largo, es necesario eliminar el limite de impresión de variables, lo cual se hace con:
set print elements 0
Cuando se imprime una variable que su contenido tiene caracteres que se repiten, y no se desea que muestre el mensaje <repeats 189 times>, se debe ejecutar:
Una de las instrucciones más importantes, se encarga de colocar los Breakpoints (o puntos de interrupción) del programa. Estos puntos de interrupción se introducen en el programa para evaluar el estado del programa en cierto momento, particularmente se utiliza para evaluar el contenido de variables.
Para colocar Breakpoints, existen varios métodos. A continuación se presentan algunos:
break <numero_linea> (b): Este coloca un Breakpoint en la linea especificada del programa que contiene el main.
break <funcion> (b): Coloca un Breakpoint en la primera linea de la implementación de la función indicada. Es importante aclarar que el Breakpoint se va a colocar en la definición de la función, no en donde es llamada la función.
break <archivo:numero_linea> (b): Coloca un Breakpoint en la linea indicada para el archivo indicado. Este formato es particularmente útil cuando se desea colocar un Breakpoint en un archivo que no contiene el main, por ejemplo un archivo *.pc.
break <archivo:funcion> (b): Coloca un Breakpoint en la linea indicada para el archivo indicado. Formato de similar utilidad al anterior.
Después de saber iniciar el programa, es necesario aprender como colocar Breakpoint, como quitarlos, como ver el contenido de las variables, inclusive como asignarle un valor a una variable durante el proceso de Debug.
Se deben verificar los permisos de escritura de la carpeta donde está el ejecutable.
Se debe establecer el limite del archivo core a ilimitado con la ejecución de:ulimit -c unlimited
Se debe ejecutar de la siguiente manera: gdb -xdb -tui <nomrbe_ejecutable> <archivo_core>
Para listar la pila de ejecución: backtrace (bt). Este comando imprime en que función se ha quedado la ejecución, es decir, muestra todas las funciones anidadas a las que se ha hecho llamado en la ejecución del programa.
Cuando se hace el debug de un programa que tiene proceso hijos (con la instrucción fork), el GDB por defecto sigue al proceso padre.
Esto se puede cambiar, mediante el seteo de la siguiente instrucción:
set follow-fork-mode child
Este seteo es válido solamente en plataformas modernas, especificamente es soportado por kernel version 2.5.46 y superiores.