Comenzando con GDB

¿Qué es BGF?

GDB, abreviatura de GNU Debugger, es el depurador más popular para sistemas UNIX para depurar programas C y C++. GNU Debugger, también llamado gdb, es el depurador más popular para sistemas UNIX para depurar programas C y C++.

GNU Debugger lo ayuda a obtener información sobre lo siguiente:

  • Si se produjo un volcado del núcleo, ¿qué declaración o expresión hizo el bloqueo del programa en?

  • Si ocurre un error al ejecutar una función, ¿qué línea del programa contiene la llamada a esa función, y cuáles son los parámetros?

  • ¿Cuáles son los valores de las variables del programa en un punto particular durante ejecución del programa?

  • ¿Cuál es el resultado de una determinada expresión en un programa?

Iniciando GDB

Para iniciar GDB, en la terminal,

gdb <executable name>

Para el ejemplo anterior con un programa llamado main, el comando se convierte en

gdb main

Establecimiento de puntos de interrupción

Probablemente querrá que su programa se detenga en algún momento para que pueda revisar la condición de su programa. La línea en la que desea que el programa se detenga temporalmente se denomina punto de interrupción.

break <source code line number>

Ejecutando tu programa

Para ejecutar su programa, el comando es, como supuso,

run

Abriendo un núcleo

gdb -c coreFile pathToExecutable  

Trabajar con un archivo principal

Creé este programa realmente malo

 #include <stdio.h>
 #include <ctype.h>

// forward declarations


void bad_function()
{

   int *test = 5;

   free(test);

}


int main(int argc, char *argv[])
{
   bad_function();
   return 0;
}


gcc -g ex1.c

./a.out   //or whatever gcc creates
Segmentation fault (core dumped)

gdb -c core a.out

Core was generated by `./a.out'.

Programa terminado con señal SIGSEGV, Fallo de segmentación. #0 __GI___libc_free (mem=0x5) en malloc.c:2929 2929 malloc.c: No existe tal archivo o directorio.

(gdb) where

#0 __GI___libc_free (mem=0x5) en malloc.c:2929 #1 0x0000000000400549 en bad_function () en ex1.c:12 #2 0x0000000000400564 en principal (argc=1, argv=0x7fffb825bd68) en ex1.c:19

Como compilé con -g, puede ver que llamar a donde me dice que no le gustó el código en la línea 12 de bad_function()

Entonces puedo examinar la variable de prueba que traté de liberar

(gdb) up

#1 0x0000000000400549 en bad_function () en ex1.c:12 12 gratis (prueba);

(gdb) print test

$1 = (int *) 0x5

(gdb) print *test

No se puede acceder a la memoria en la dirección 0x5

En este caso, el error es bastante obvio. Traté de liberar un puntero al que se le asignó la dirección 5 que no fue creada por malloc, por lo que free no tiene idea de qué hacer con él.