Depurador GNU

Depurador GNU Descripción de la imagen Gdb-7.3-debugging-session.png. Información
Desarrollado por Proyecto GNU
Primera versión 1986
Última versión 10,2 (25 de abril de 2021)
Depositar sourceware.org/git/gitweb.cgi?p=binutils-gdb.git
Escrito en C y Scheme
Sistema de explotación GNU / Linux , BSD ( d ) , Microsoft Windows y macOS
Idiomas inglés
Tipo Depurador
Licencia GPL-3.0 + ( d )
Sitio web www.gnu.org/software/gdb

GNU Debugger , también llamado GDB , es el depurador estándar del proyecto GNU . Es portátil en muchos sistemas similares a Unix y funciona para varios lenguajes de programación, como C , C ++ , Fortran , Ada , Objective-C y Go . Fue escrito por Richard Stallman en 1988. GDB es un software libre , publicado bajo la licencia GNU GPL .

Historia

GDB fue escrito por primera vez por Richard Stallman en 1986 junto con su sistema GNU , después de que GNU Emacs fuera considerado "razonablemente estable". GDB es un software gratuito publicado bajo la Licencia Pública General GNU (GPL). Está inspirado en el depurador DBX , que formaba parte de la distribución Unix de Berkeley .

De 1990 a 1993 fue mantenido por John Gilmore . Ahora lo mantiene el comité directivo del BGF, establecido por la Free Software Foundation .

Caracteristicas

GDB funciona en muchas arquitecturas de procesador diferentes y permite la depuración remota (a través de un enlace en serie o conexión IP) de aplicaciones que se ejecutan en una plataforma de destino separada de la plataforma de desarrollo. Esto posiblemente en dos tipos diferentes de procesadores.

GDB le permite depurar un programa en ejecución (desplazándolo hacia abajo instrucción por instrucción o examinando y modificando sus datos), pero también permite la depuración post-mortem al analizar un archivo central que representa el contenido de un programa completo.

Interfaces de usuario

La interfaz de GDB es una línea de comandos simple, pero hay aplicaciones de front-end que le dan una interfaz gráfica mucho más fácil de usar. La utilidad ddd , por ejemplo, permite hacer clic en una línea de código directamente en la lista para colocar un punto de interrupción allí, mientras que GDB solo requiere la entrada del número de línea. Tenga en cuenta también que GDB a menudo se invoca en segundo plano mediante entornos de desarrollo integrados como Eclipse .

Depuración remota

GDB ofrece un modo "remoto" que se puede utilizar a menudo al depurar en sistemas integrados. La operación remota es cuando GDB se está ejecutando en una computadora y el programa que se está depurando se está ejecutando en otra computadora . GDB también puede comunicarse con el "stub" remoto que comprende el protocolo GDB a través de un dispositivo en serie o mediante el protocolo TCP / IP . Se puede crear un programa de reemplazo mediante la vinculación a los archivos de código auxiliar adecuados suministrados con GDB, que implementan el lado de destino del protocolo de comunicación. También es posible utilizar gdbserver para depurar el programa de forma remota sin tener que modificarlo.

KGDB también usa el mismo modo para depurar un kernel de Linux en ejecución en el nivel de fuente con gdb. Con KGDB , los desarrolladores de kernel pueden depurar un kernel de la misma forma que depuran programas de aplicación. Le permite colocar puntos de interrupción en el código del kernel, recorrer el código y también observar variables. En algunas arquitecturas donde los registros de depuración de hardware están disponibles, es posible definir puntos de control que desencadenan puntos de interrupción cuando se ejecutan direcciones de memoria específicas. KGDB requiere una computadora adicional conectada a la computadora para ser depurada usando un cable serial o Ethernet . En el sistema operativo FreeBSD , también es posible depurar usando el acceso directo a la memoria Firewire.

Ejemplos de comandos

programa gdb ejecutar gdb con el programa "programa"
ejecutar -v iniciar el programa cargado con el parámetro "-v"
bt muestra el seguimiento de la llamada (útil en caso de que el programa falle)
registros de información muestra todos los registros
decir mano desmontar la función principal

Ejemplo de uso

Considere el siguiente código fuente escrito en C:

//Bibliothèques standard du C #include <stdio.h> #include <stdlib.h> #include <string.h> size_t foo_len( const char *s ) { return strlen( s ); } int main( int argc, char *argv[] ) { const char *a = NULL; printf( "size of a = %lu\n", foo_len(a) ); return 0; }

Si usa el compilador GCC en Linux , el código anterior debe compilarse con el indicador -g para incluir la información de depuración adecuada sobre el binario generado, lo que permite inspeccionarlo usando GDB. Suponiendo que el archivo que contiene el código anterior se llama example.c, el comando para la compilación podría ser:

$ gcc exemple.c -Og -g -o exemple

Y el binario ahora se puede ejecutar:

$ ./exemple Segmentation fault

Cuando se ejecuta el binario, genera un error de segmentación, GDB se puede usar para inspeccionar el problema con el fin de resolverlo.

$ gdb ./exemple GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16) Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://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". For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>... Reading symbols from /path/exemple...done. (gdb) run Starting program: /path/exemple Program received signal SIGSEGV, Segmentation fault. 0x0000000000400527 in foo_len (s=0x0) at exemple.c:8 8 return strlen (s); (gdb) print s $1 = 0x0

El problema está presente en la línea 8 y ocurre al llamar a la función strlen (porque su argumento, s, es NULL). Dependiendo de la implementación de strlen (online o no), el resultado puede ser diferente, por ejemplo:

GNU gdb (GDB) 7.3.1 Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://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 "i686-pc-linux-gnu". For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>... Reading symbols from /tmp/gdb/exemple...done. (gdb) run Starting program: /tmp/gdb/exemple Program received signal SIGSEGV, Segmentation fault. 0xb7ee94f3 in strlen () from /lib/i686/cmov/libc.so.6 (gdb) bt #0 0xb7ee94f3 in strlen () from /lib/i686/cmov/libc.so.6 #1 0x08048435 in foo_len (s=0x0) at exemple.c:8 #2 0x0804845a in main (argc=<optimized out>, argv=<optimized out>) at exemple.c:16

Para resolver este problema, la variable a (en la función principal) debe contener una cadena válida. Por ejemplo :

//Bibliothèques standard du C #include <stdio.h> #include <stdlib.h> #include <string.h> size_t foo_len( const char *s ) { return strlen(s); } int main( int argc, char *argv[] ) { //correction ici const char *a = "Hello World!\n"; printf( "size of a = %lu\n", foo_len(a) ); return 0; }

Ahora, si recompilamos y ejecutamos el binario nuevamente con GDB, el resultado es correcto:

GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16) Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://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". For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>... Reading symbols from /path/exemple...done. (gdb) run Starting program: /path/exemple size of a = 13 [Inferior 1 (process 14290) exited normally]

GDB muestra en la salida estándar que el programa terminó normalmente.

Bibliografía

  • (en) Richard Stallman , Roland Pesch , Stan Shebs et al , Depuración con GDB: El depurador de nivel de fuente GNU , Free Software Foundation,2012, 10 ª  ed. , 616  p. ( ISBN  978-0-9831592-3-0 )
  • (en) Arnold Robbins, GDB Pocket Reference , O'Reilly Media,Mayo de 2005, 1 st  ed. , 78  p. ( ISBN  978-0-596-10027-8 , leer en línea )

Ver también

Notas y referencias

  1. “  conferencia de Richard Stallman en el Instituto Real de Tecnología, Suecia  (10/30/1986) ” (visitada 9 de octubre de, 2019 )  : “  Luego, después de GNU Emacs era razonablemente estable, que se llevó todo en todo un año y a la mitad, comencé a regresar a otras partes del sistema. Desarrollé un depurador al que llamé GDB, que es un depurador simbólico para código C, que recientemente entró en distribución. Ahora bien, este depurador está en gran medida en el espíritu de DBX, que es un depurador que viene con Berkeley Unix.  "
  2. (en) Joel Brobecker, "¡  Lanzamiento de GDB 10.2!  " ,25 de abril de 2021(consultado el 4 de mayo de 2021 )
  3. (in) "  GDB Steering Committee  " (consultado el 11 de mayo de 2008 )
  4. (en) Norman Matloff y Peter Jay Salzman , El arte de depurar con GDB, DDD y Eclipse , No Starch Press,2008, 264  p. ( ISBN  978-1-59327-174-9 , leer en línea ).

enlaces externos