Cómo usar GDB para depurar programas en Ubuntu 20.04

GNU Debugger (GDB) es un depurador de código abierto para sistemas GNU. El depurador es portátil y se puede utilizar para varios lenguajes como C / C ++ y Fortran. Se puede utilizar para depurar programas al observar sus estados en puntos de interrupción específicos e incluso alterar el flujo o los valores para su posterior ejecución. Por lo general, el GDB se ejecuta en la línea de comandos, pero también se han desarrollado varias GUI para él.

En este artículo, exploramos cómo depurar programas C usando GDB en Ubuntu 20.04 LTS (Focal Fossa).

Prerrequisitos

  • Sistema Ubuntu 20.04
  • Usuario con sudo privilegios para cambiar el nombre de varios archivos.

Nota: Los comandos discutidos en este artículo se han probado en Ubuntu 20.04 LTS (Focal Fossa).

Instalación de paquetes

Instale los paquetes GN de ​​requisitos previos para compilar y depurar. Ejecute el siguiente comando en la terminal:

PS sudo apto instalar gcc gdb -y

Programa C example para depurar

Código

Antes de ejecutarse, es necesario compilar un programa. Vamos a compilar el siguiente código C en el archivo main.c.

#include int main () {for (int i = 0; i <5; ++ i) {printf ("Iterador:% d n", i); } return 0; }

Compilar el programa C usando GCC

Por lo general, un código C se compila en GCC usando el siguiente comando:

$ gcc main.c -o bin

Es necesario proporcionar otro argumento para incluir símbolos en el binario. GDB utiliza estos símbolos para rastrear y depurar el programa. Ejecute el siguiente comando en la terminal para compilar el código C:

$ gcc -g main.c -o bin

Programa de compilación

Aparecerá un archivo ejecutable llamado bin.

Ejecuta el programa de prueba

El archivo binario denominado bin se puede ejecutar como cualquier otro archivo ejecutable en una interfaz de línea de comandos. Use el siguiente comando para ejecutarlo en la terminal:

$ ./bin

Ejecute la aplicación de prueba

Aparecerá la salida del código.

Depurar una aplicación en Linux

Iniciar depurador

Ejecute la utilidad GDB usando el siguiente comando en la terminal:

$ gdb bin

Programa de depuración usando GDB

Presione enter. Aparecerá la consola para el terminal GDB. Enter el comando de ejecución en esta consola para ejecutar el ejecutable proporcionado a la utilidad como argumento.

(gdb) ejecutar

Salida de depuración

Puntos de interrupción de depuración

Agregar puntos de interrupción

Los puntos de interrupción se pueden agregar de varias formas. Agregaremos un punto de interrupción en la función printf en nuestro código. Ejecute el siguiente comando en la terminal para agregar un punto de interrupción:

(gdb) romper printf

Agregar punto de interrupción en GDB

Alternativamente, también se puede usar un número de línea para agregar un punto de interrupción.

(gdb) descanso 6

Agregar punto de interrupción por número de línea en GDB

Enter el comando de ejecución y el programa se detendrá en el punto de interrupción.

Programas de depuración con puntos de interrupción

Paso a través de los puntos de interrupción

Utilice el comando continuar para continuar la ejecución del programa.

(gdb) continuar

Comando continuar GDB

Hay otros dos comandos para diferentes propósitos de continuar la ejecución del programa:

  • Paso: recorre la siguiente instrucción de la máquina.
  • Siguiente: pasos para pasar a la siguiente línea de código.

También se pueden utilizar abreviaturas de comandos. Como la abreviatura del comando continue es c.

(gdb) c

atajo para continuar comando

Información sobre los puntos de interrupción

La información sobre los puntos de interrupción se puede observar usando el comando info de gdb. Ejecute el siguiente comando en la terminal:

(gdb) puntos de interrupción de información

Información del punto de interrupción

Aparecerá la información sobre los puntos de interrupción.

Nota: El número a la izquierda del punto de interrupción se usa para referirse a él mediante otros comandos.

Eliminar puntos de interrupción

Se puede eliminar un punto de interrupción utilizando el comando de eliminación y haciendo referencia al número de punto de interrupción observado en la salida de la utilidad de información.

(gdb) eliminar 1

Eliminación de Btreakpoints en GDB

Ahora el punto de interrupción se ha eliminado y, si se ejecuta, el programa se ejecutará directamente hasta el final.

Ver variables

Las variables se pueden ver usando la utilidad de reloj. Primero, necesitamos ingresar al ámbito en el que existe la variable. Para este propósito, primero agregue un punto de interrupción usando el siguiente comando:

(gdb) descanso 6

Luego, ejecute el código que llega a este punto de interrupción.

(gdb) r

Mostrar contenido variable

Ahora estamos en el ciclo donde existe la variable i.

El comando watch se utilizará para observar el valor anterior y el nuevo de la variable i en el bucle.

(gdb) mira yo

Ver el valor de una variable usando GDB

Ahora, el punto de interrupción generado por el comando de vigilancia también aparecerá en la lista de puntos de interrupción. La lista de puntos de interrupción se puede mostrar usando el siguiente comando:

(gdb) puntos de interrupción de información

Puntos de interrupción de información de GDB

Además, no necesitamos el punto de interrupción insertado anteriormente. Se puede eliminar fácilmente con el siguiente comando:

(gdb) eliminar 1

Eliminar el punto de interrupción

Ahora, si continúa, el código verá valores siempre que la variable haya cambiado el valor y mostrará valores nuevos y antiguos.

(gdb) c

Continuar depurando

También se pueden observar más iteraciones del programa, usando el mismo comando.

Ver iteraciones

Salir del depurador

Ejecute el siguiente comando en la terminal para salir del depurador.

(gdb) salir

Salir de la depuración

Esta close gdb y aparecerá la línea de comandos predeterminada.

Conclusión

En este artículo, exploramos cómo ejecutar y romper un programa en GDB. Además, también se configuró para romperse cuando cambia el valor de una variable. Esperamos que pueda depurar fácilmente sus programas en GDB después de seguir este artículo.