GDB
1. Antes de empezar
1.1. Paso 1
Revise el contenido de apoyo descrito a continuación:
1.2. Paso 2
Complemente el contenido anterior viendo el video: GDB - CS50 Shorts (link) mostrado a continuación:
En este se hace uso de una aplicación online muy buena llamada https://ide.cs50.io/.
1.3. Paso 3
Para el laboratorio se hará uso del gdb
disponible en la maquina con linux. Sin embargo lo animamos a que haga uso de otras alternativas más amigables como onlinegdb o gdbgui.
2. Primeros pasos con el gdb
2.1. Codificación del programa
Codifique el siguiente programa guardandolo como main.c
#include <stdio.h>
int main() {
int f1 = factorial(4);
int f1 = factorial_recursivo(5);
printf("4! = %d\n",f1);
printf("5! = %d\n",f2);
return 0;
}
int factorial(int num){
fac = 1;
for(int = 1; i <= num;i++) {
fac = fac*i;
}
return fac;
}
int factorial_recursivo(int num){
if(num > 0) {
return num*factorial_recursivo(num - 1);
}
else {
return 1;
}
}
Usando el siguiente comando compilelo, si tiene errores corrijalo:
gcc -Wall -g main.c -o main.out
Preguntas
- Como se puede notar, se observa un nuevo parametro en el gcc, este es
-g
. ¿Que significa este?
Una vez que tenga todo corregido continue los pasos dados en la siguiente sección:
2.2. Explorando los comandos
2.2.1. Arrancando el gdb
Para iniciar el gdb se emplea el comando gdb
, sin embargo usar este solo hacer el debug no es amigable asi que se recomuenta agregar el parametro adicional -tui
. De este modo, el comando será:
gdb -tui
Una vez se esta dentro del gdb
se carga la consola de este esperando la entrada de comandos propios del gdb
. Esta tiene la siguiente forma:
(gdb)
2.2.2. Conociendo los comandos disponibles
Para tal fin se usan los comandos:
help
help all
help [comando]
apropos word
2.2.3. Cargando un archivo en el gdb
Una vez el gdb arranco (gdb -tui
) se carga un archivo mediante el comando:
file nombreEjecutable
Asi para nuestro caso como el ejecutable se llama main.out
el comando será:
file main.out
El resultado de esto aparece a continuación:
file
.2.2.4. Visualizando el archivo fuente cargado en el gdb
El comando mas practico para esto es [l]ist
, en los documentos de las referencias puede encontrar mas exacamente como usar este comando. Por ahora vamos a ejecutar los siguientes comandos (asumiendo que ya se cargo el archivo en el gdb):
# Comando 1
l
# Comando 2
l
# Comando 3
l
La salida es algo como lo siguiente:
list
.Continuando con la aplicación de los comandos tenemos:
# Comando 4
l 1
list
.l
es el abreviado de list
.
2.2.5. Ejecutando el archivo en el gdb
Con el comando list anteriormente mencionado se pudo visualizar el condigo fuente del ejecutable al cual se le esta haciendo el debuging. Con el comando run
se ejecuta el programa:
run
run
.Una vez ejecutado el programa, si lo que se quiere es ejecutarlo nuevamente se puede correr nuevamente este comando.
2.2.6. Colocando breakpoints
Un breakpoint hace referencia a un punto de parada en la ejecución del codigo. Estos son muy comunes para el desarrollo de pruebas de escritorio ya que permiten ir evaluando el estado de las variables a medida que el programador va moviendose entre estos. El comando para poner un breakpoint es [b]reak
y sus diferentes variantes pueden consultarse en las referencias de apoyo dispuestas. Por ahora ejecutemos los siguientes comandos. Antes de esto tenga en cuenta que el abreviado del comando break
es b
y es con este ultimo que se ejecutan los ejemplos:
# Comando 1
b 4
# Comando 2
break 9
# Comando 3
b factorial
La siguiente figura muestra el resultado:
break
.Notese de la figura anterior, los simbolos b+ agregados a la izquierda del codigo. Es alli donde se colocaron los breakpoints. Es bueno vez colocados los breakpoints listarlos, para ello se usa el comandos:
# Comando 4
info breakpoints
La siguiente figura muestra el resultado:
info breakpoints
.Notese que cada breakpoint tiene información asociada a este pero resaltamos la primera columna en la cual se puede ver el numero del breakpoint. Conocer este numero es importante por que es el que se emplea para eliminar o desabilitar un breakpoint determinado. Para ello vamos a realizar las siguientes tareas:
-
Agregar un breakpoint en la función
factorial_recursivo
# Comando 5
break factorial_recursivo -
Listar los breakpoints disponibles.
# Comando 6
info breakpointsEn la siguiente figura se muestra el resultado:
Fig 7. Comando info breakpoints
. -
Deshabilitar el breakpoint anteriormente agregado (ojo tenga en cuenta el numero de este).
# Comando 7
disable 4 -
Listar los breakpoints disponibles para ver los cambios.
# Comando 8
info breakpointsEn la siguiente figura se muestra el resultado despues de aplicar los comandos anteriormente mencionados. Observe los cambios:
Fig 8. Comando info breakpoints
. -
Eliminar el breakpoint anterior y listar nuevamente los breakpoints disponibles para ver los cambios.
# Comando 9
delete 4
# Comando 10
info breakpointsPara el caso, en la siguiente figura se muestra el resultado:
En la siguiente figura se muestra el resultado. Observe los cambios:
Fig 8. Comando info breakpoints
despues de la eliminación de un brakpoint.