martes, 16 de marzo de 2010

Como Depurar un Programa C en 5 Pasos

En este articulo se vera como depurar un programa escrito en C en 5 pasos usando el depurador gdb en Linux.

Escribir un Programa en C con errores para probar el depurador

Para aprender a depurar en C, crea el siguiente programa C que calcula e imprime el factorial de un numero. Sin embargo este programa C contiene algunos errores para el propósito de depuración.

$ vim factorial.c
# include <stdio.h>

int main()
{
int i, num, j;
printf ("Ingresar un numero: ");
scanf ("%d", &num );

for (i=1; i<num; i++)
j=j*i;

printf("El factorial de %d es %dn",num,j);
}

$ ./a.out
Ingresa un numero: 3
El factorial de 3 es 12548672

Ahora se vera como depurar usando gdb.

Paso 1. Compilar el programa C con la opción -g

Al compilar el programa C con la opción -g se le permite al compilador recolectar la información de depuración.

$ cc -g factorial.c

Paso 2. Configurar un punto de quiebre dentro del programa C

Sintaxis:

break numero_linea

Otros formatos
  • break [nombre_archivo]:numero_linea
  • break [nombre_archivo]:función
Coloca los puntos de quiebre en el programa C donde sospeches que haya errores. Mientras ejecutas el programa el depurador detendrá donde se encuentre el punto de quiebre y dará el cursor al depurador.

Entonces antes de iniciar el programa, coloca los siguientes puntos de quiebres en el programa factorial.

break 10
Breakpoint 1 at 0x804846f: file factorial.c, line 10.

Paso 3. Ejecutar el programa C en el depurador gdb

run [args]

Puedes iniciar el programa usando el comando run en el depurador gdb. Tambien puedes pasar argumentos a la linea de comando para el programa vía run args. El programa de ejemplo que se esta usando no requiere algun argumento en la linea de comando para ejecutarlo e iniciar el programa.

run
Starting program: /home/usuario/Debugging/c/a.out

Una vez que se haya ejecutado el programa C, este se ejecutaría hasta el primer punto de quiebre.

Breakpoint 1, main () at factorial.c:10
10 j=j*i;

Puedes usar varios comandos gdb para depurar el programa C, tal como se explicara en la siguiente sección.

Paso 4. Imprimir los valores de las variables dentro del depurador gdb

Sintaxis:
print {variable}

Ejemplos:

print i
print j
print num

(gdb) p i
$1 = 1
(gdb) p j
$2 = 3042592
(gdb) p num
$3 = 3
(gdb)

Como se vio arriba, en el programa factorial.c no se inicializó la variable j. Entonces, la variable obtiene un valor basura resultando en un numero grande como valores del factorial.

Repara el problema inicializando la variable j con 1, compila el programa C y ejecútalo de nuevo.

Aunque después de repararlo parece que continúan algunos problemas en el programa, por que continua dando valores de factorial erróneos.

Por eso, coloca el punto de quiebre en la linea 10 y continua con la explicación en la siguiente sección.

Paso 5. Continuar con los comandos de gdb

Hay tres clases de operaciones de gdd que puedes escoger cuando el programa se detiene en un punto de quiebre. Estos son continuar hasta el siguiente punto de quiebre, detenerse en el mismo o detenerse sobre la siguiente linea de programa.

  • c o continue: El depurador continuara hasta el siguiente punto de quiebre.
  • n o next: El depurador ejecutara la siguiente linea como una sola instruccion.
  • s o step: Igual que next pero no trata la funcion como una sola instruccion sino se va hasta la función y la ejecuta linea por linea.


Atajos de comandos gdb

Usa los siguientes atajos para las operaciones mas frecuentes de gdb

  • l – listar
  • p – imprimir
  • c – continuar
  • s – paso
  • ENTER: al presionar enter se ejecutaría el comando anteriormente ejecutado.

No hay comentarios: