GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo depurar el programa C usando gdb en 6 pasos simples

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

Métodos abreviados de comandos gdb

Use los siguientes atajos para la mayoría de las operaciones frecuentes de gdb.

  • l – lista
  • p – imprimir
  • c – continuar
  • s – paso
  • ENTRAR:al pulsar la tecla Intro se ejecutaría de nuevo el comando ejecutado anteriormente.

Comandos gdb misceláneos

  • comando l: Use el comando gdb l o list para imprimir el código fuente en el modo de depuración. Use l line-number para ver un número de línea específico (o) l function para ver una función específica.
  • bt:retroceder – Imprima el seguimiento de todos los marcos de la pila o los COUNT marcos más internos.
  • ayuda – Ver ayuda para un tema de gdb en particular:ayuda TOPICNAME.
  • salir – Salir del depurador gdb.

Linux
  1. Depurar Linux usando ProcDump

  2. Cómo depurar programas C en Linux usando gdb

  3. ¿Cómo depurar un script Bash?

  4. Cómo habilitar el registro de depuración de NFS usando rpcdebug

  5. ¿Cómo configurar la variable de entorno dentro de GDB usando el comando de shell?

Cómo tematizar GNOME Shell 3.16 (en cinco sencillos pasos)

Cómo rastrear la ejecución del programa usando el comando Strace de Linux

Cómo compilar C, C++ y Java usando Terminal en Linux

Cómo usar GDB para depurar programas en Ubuntu 20.04

Cómo crear texto curvo en GIMP en 5 pasos simples [Tutorial para principiantes de GIMP]

Consejos de Ubuntu:Cómo administrar proyectos simples usando Tomboy Notes