Anteriormente discutimos los conceptos básicos de cómo escribir y compilar un programa C con C Hello World Program.
En este artículo, analicemos cómo depurar un programa c usando el depurador gdb en 6 simples pasos.
Escriba un programa C de muestra con errores para fines de depuración
Para aprender a depurar programas en C, creemos el siguiente programa en C que calcula e imprime el factorial de un número. Sin embargo, este programa C contiene algunos errores para nuestro propósito de depuración.
$ vim factorial.c # include <stdio.h> int main() { int i, num, j; printf ("Enter the number: "); scanf ("%d", &num ); for (i=1; i<num; i++) j=j*i; printf("The factorial of %d is %d\n",num,j); }
$ cc factorial.c $ ./a.out Enter the number: 3 The factorial of 3 is 12548672
Vamos a depurarlo mientras revisamos los comandos más útiles en gdb.
Paso 1. Compile el programa C con la opción de depuración -g
Compile su programa C con la opción -g. Esto permite que el compilador recopile la información de depuración.
$ cc -g factorial.c
Nota:El comando anterior crea un archivo .out que se usará para la depuración como se muestra a continuación.
Paso 2. Inicie gdb
Inicie el depurador de C (gdb) como se muestra a continuación.
$ gdb a.out
Paso 3. Configure un punto de interrupción dentro del programa C
Syntax: break line_number
Otros formatos:
- dividir [nombre_de_archivo]:número_de_línea
- dividir [nombre_de_archivo]:nombre_de_función
Coloca un punto de ruptura en el programa C, donde sospecha que hay errores. Mientras ejecuta el programa, el depurador se detendrá en el punto de interrupción y le indicará que depure.
Entonces, antes de iniciar el programa, coloquemos el siguiente punto de interrupción en nuestro programa.
break 10 Breakpoint 1 at 0x804846f: file factorial.c, line 10.
Paso 4. Ejecute el programa C en el depurador gdb
run [args]
Puede comenzar a ejecutar el programa usando el comando ejecutar en el depurador de gdb. También puede dar argumentos de línea de comando al programa a través de argumentos de ejecución. El programa de ejemplo que usamos aquí no requiere ningún argumento en la línea de comandos, así que vamos a ejecutar y comenzar la ejecución del programa.
run Starting program: /home/sathiyamoorthy/Debugging/c/a.out
Una vez que haya ejecutado el programa C, se ejecutará hasta el primer punto de interrupción y le dará el aviso para la depuración.
Breakpoint 1, main () at factorial.c:10 10 j=j*i;
Puede usar varios comandos gdb para depurar el programa C como se explica en las secciones a continuación.
Paso 5. Imprimir los valores de las variables dentro del depurador gdb
Syntax: print {variable} Examples: print i print j print num
(gdb) p i $1 = 1 (gdb) p j $2 = 3042592 (gdb) p num $3 = 3 (gdb)
Como ves arriba, en el factorial.c, no hemos inicializado la variable j. Por lo tanto, obtiene un valor basura que da como resultado números grandes como valores factoriales.
Solucione este problema inicializando la variable j con 1, compile el programa C y ejecútelo de nuevo.
Incluso después de esta solución, parece haber algún problema en el programa factorial.c, ya que todavía da un valor factorial incorrecto.
Por lo tanto, coloque el punto de ruptura en la décima línea y continúe como se explica en la siguiente sección.
Paso 6. Continúe, pasando por encima y dentro – comandos gdb
Hay tres tipos de operaciones de gdb que puede elegir cuando el programa se detiene en un punto de interrupción. Continúan hasta el siguiente punto de ruptura, interviniendo o pasando por encima de las siguientes líneas del programa.
- c o continuar:el depurador seguirá ejecutándose hasta el siguiente punto de interrupción.
- n o next:el depurador ejecutará la siguiente línea como una sola instrucción.
- s o paso:Igual que el siguiente, pero no trata la función como una sola instrucción, sino que entra en la función y la ejecuta línea por línea.
Al continuar o recorrer paso a paso, podría haber encontrado que el problema se debe a que no hemos usado el <=en la verificación de la condición 'for loop'. Así que cambiar eso de
Use los siguientes atajos para la mayoría de las operaciones frecuentes de gdb.Métodos abreviados de comandos gdb
Comandos gdb misceláneos