Comenzando con GDB
En esta página
¿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.