
Unos de los lenguajes utilizados en casi todas las Universidades para enseñar a programar es lenguaje C / C++ en mis comienzos en la programación usando vim y compilando por la linea de comando no tenia un IDE como Eclipse, Netbeans o IntellijJ IDEA para depurar el código, y me surgió la duda de como un viejo amigo podía depurar su código en vim y me puse manos a la obra ya que tengo que saber como se hace.
Lo primero que voy a hacer es instalar el gdb y el editor vim desde la consola de linux ejecutamos:
1 |
apt-get install gdb vim |
Ahora vamos a crear un pequeño ejemplo para hacer nuestra depuración:
vim aritmetica.c
Si queremos ver la sintaxis del lenguaje en el editor vim podemos habilitarla entrado al Modo de Comandos «usando ESC» y escribiendo «syntax on»
Ahora entrando al modo de inserción con la letra «i» escribimos nuestro codigo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <stdio.h> #include <stdlib.h> void verInverso(int *ptr, int tam){ int i, valor; for (i = tam-1; i >= 0; i--){ valor = *(ptr--); printf("arr[%d] = %d\n", i, valor); } } void ver(int *ptr, int tam){ int i, valor; for (i = 0; i < tam; i++){ valor = ptr[i]; printf("arr[%d] = %d\n", i, valor); } } main(){ int arr[5] = {1,2,3,4,5}; ver(arr, 5); verInverso(&arr[4], 5); } |
Luego volvemos a el modo comando y escribimos «wq» para guardar y salir
Ahora vamos a compilar nuestro código:
1 |
gcc aritmetica.c -g -o aritmetica.out |
Hemos usado la opción -g para habilitar la depuración y la opción -o es para darle un nombre al programa compilado.
Ahora usamos el comando gdb para iniciar la depuración
1 |
gdb -tui aritmetica.out |
El comando anterior nos muestra la siguiente pantalla:
Ahora vamos a colocar nuestros puntos de interrupción en cualquier parte del código fuente con depurador. Aquí tienes las opciones para establecer un punto de interrupción en un número de línea del archivo fuente de corriente:
break [line number]
o en un número de línea de un archivo de origen específica:
break [file name]:[line number]
o en una función particular:
break [function name]
Y aún mejor, puede establecer puntos de interrupción condicionales:
break [line number] if [condition]
en mi caso voy a colocar uno en la linea 19 donde comienza el main
1 2 |
(gdb) break 19 Breakpoint 1 at 0x4005b2: file aritmetica.c, line 19. |
Podemos colocar un «punto de observación», que hará una pausa en el programa si se modifica una variable:
watch [variable]
Aquí, puedo establecer una como:
watch valor
Ahora ejecutamos el programa con
r [argumentos de línea de comando si tuviera alguno]
1 2 3 4 |
(gdb) r Starting program: /home/jestevez/aritmetica.out Breakpoint 1, main () at aritmetica.c:19 |
El programa se ha ejecutado y se ha detenido en la linea 19 donde colocamos nuestro break point. A partir de ahora las cosas comienzan a ponerse interesantes.
El comando bt «backtrack» nos dirá cómo hemos llegado a ese punto.
1 2 |
(gdb) bt #0 main () at aritmetica.c:19 |
info locals
Este comando mostrará todas las variables locales y sus valores actuales
1 2 |
(gdb) info locals arr = {4195840, 0, 4195344, 0, -7600} |
Por supuesto:
p [variable]
mostrará el valor de una variable en particular.
1 2 |
(gdb) p arr $1 = {4195840, 0, 4195344, 0, -7600} |
También podemos ver el tipo :
ptype [variable]
Muestra el tipo de una variable local. Así que aquí podemos confirmar que arr es arreglo de 5.
1 2 |
(gdb) ptype arr type = int [5] |
Si deseamos cambiar el valor de una variable podemos usar
set var [variable] = [new value]
Ahora vamos a inicializar los valores dentro del arreglo dado que no lo inicializamos y tiene valores basura
1 2 3 4 5 |
set var arr = {0,0,0,0,0} (gdb) set var arr = {0,0,0,0,0} (gdb) p arr $2 = {0, 0, 0, 0, 0} |
Y al igual que cualquier buen depurador, podemos ir «paso» a «paso» con:
step
para ejecutar la siguiente línea y potencialmente entrar en una función:
next
para ir directamente a la línea de abajo, haciendo caso omiso de cualquier llamada a la función.
Y para terminar la prueba, puede eliminar un punto de interrupción con:
delete [line number]
Sigue corriendo el programa desde el punto de interrupción actual con:
continue
y para salir de GDB:
quit
Como vemos gdb es muy útil si tenemos algoritmos en lenguaje c o c++ que necesitamos mantener o modificar.