Gdb o GNU Project Debugger es una gran herramienta cuando necesita depurar un programa. Puede establecer puntos de interrupción, observar el cambio de valor de una variable o incluso cambiar un valor para el programa mientras está detenido en un punto de su estado y luego continuar, solo para elegir algunas de las funciones de gdb.
En este tutorial, instalaremos gdb en RHEL 8 y probaremos cómo funciona con una aplicación C simple.
En este tutorial aprenderás:
- Cómo instalar gdb
- Cómo compilar una aplicación C simple con símbolos de depuración
- Cómo establecer puntos de interrupción en la aplicación en ejecución con gdb
- Cómo imprimir valores reales de variables dadas dentro de la aplicación
Pasando por un bucle for con gdb.
Requisitos de software y convenciones utilizadas
Requisitos de software y convenciones de la línea de comandos de Linux Categoría | Requisitos, convenciones o versión de software utilizada |
Sistema | Red Hat Enterprise Linux 8 |
Software | gdb 8.2 |
Otro | Acceso privilegiado a su sistema Linux como root o a través de sudo comando. |
Convenciones | # – requiere que los comandos de Linux dados se ejecuten con privilegios de root, ya sea directamente como usuario root o mediante el uso de sudo comando $ – requiere que los comandos de Linux dados se ejecuten como un usuario normal sin privilegios |
Cómo instalar gdb en Redhat Linux 8 instrucciones paso a paso
Para este tutorial, usaremos una aplicación C simple que establece algunas variables, imprime algún texto y cambia los valores de sus variables más adelante. Está construido solo para mostrar algunas características de gdb
, y no tiene uso en el mundo real.
Si no está familiarizado con el lenguaje de programación C, puede consultar el desarrollo de C en la Introducción de Linux para comenzar. Por ahora considere el siguiente código fuente, que pondremos en vars.c
archivo de texto:
#include <stdio.h>
int main()
{
int i = 1;
int j = 10;
printf("Variables set\n)";
i++;
j = 20;
printf("Variable values modified\n");
return 0;
}
Usaremos este sencillo programa para probar gdb
. Puede notar en el código que las variables de valores i
y j
take nunca estará expuesto bajo la ejecución normal del programa, por lo que no sabremos cuáles son sus valores, dónde y cuándo. En este caso es un simple desperdicio de memoria, pero piense en un caso de uso donde i
tendría algo importante, tal vez una contraseña codificada, un código de trucos u otro tesoro (o simplemente no puede encontrar dónde fallan los cálculos de su programa).
gdb
es parte de las Development Tools
grupo de paquetes, por lo que si ha instalado las herramientas de desarrollo, ya tiene gdb. Si no, puede instalarlo solo:# dnf install gdb
También necesitaremos debuginfo para glibc para nuestras pruebas:
# dnf debuginfo-install glibc-2.28-18.el8.x86_64
- Obtuvimos la herramienta de depuración y el código fuente. Para que la depuración sea útil, necesitamos compilar nuestro programa con símbolos de depuración (agregamos el
-g
opción):$ gcc -g -o vars vars.c
Si ejecutamos nuestras vars
programa, generará las cadenas en el printf
líneas, pero no mencionará i
y j
, como se esperaba.
$ ./vars
Variables set
Variable values modified
- Necesitamos saber los valores de
i
y j
cuando se configuraron por primera vez y antes de que el programa saliera. Considere las líneas #7 y #10 (el printf
líneas) en la fuente. Sería ideal si pudiéramos detener la ejecución en esas líneas, obtener los valores, luego soltar el programa nuevamente, etc. Haremos exactamente esto para probar gdb
. Lo comenzamos con las vars
compiladas ejecutable como argumento:$ gdb vars
GNU gdb (GDB) Red Hat Enterprise Linux 8.2-3.el8
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from vars...done.
(gdb)
gdb
lee los símbolos en el programa y nos da la indicación para actuar. Las vars
el programa no se inicia en este punto. Revisamos nuestras notas y establecemos un breakpoint
en la línea #7:
(gdb) break 7
Breakpoint 1 at 0x40059c: file vars.c, line 7.
Y línea #10:
(gdb) break 10
Breakpoint 2 at 0x4005b1: file vars.c, line 10.
Con los puntos de interrupción establecidos, comenzamos la ejecución:
(gdb) run
Starting program: /tmp/devel/vars
Breakpoint 1, main () at vars.c:7
7 printf("Variables set\n");
La ejecución se detiene en el primer punto de interrupción y podemos imprimir los valores de las variables ocultas:
(gdb) print i
$1 = 1
(gdb) print j
$2 = 10
Obtuvimos la primera parte de la información necesaria, continuemos con la ejecución:
(gdb) continue
Continuing.
Variables set
Breakpoint 2, main () at vars.c:10
10 printf("Variable values modified\n");
Podemos imprimir los valores de la misma manera en el siguiente punto de interrupción:
(gdb) print i
$3 = 2
(gdb) print j
$4 = 20
Tenemos todo lo que necesitábamos. No quedan más puntos de interrupción, por lo que la aplicación se cerrará normalmente después de imprimir la última línea de texto.
(gdb) continue
Continuing.
Variable values modified
[Inferior 1 (process 2330) exited normally]
(gdb) q
Obtuvimos los valores de las variables secretas y probamos que nuestro gdb
es tan útil como debe ser.