El depurador de GNU ( GDB ) es un portátil depurador que se ejecuta en muchos Unix sistemas y obras para muchos lenguajes de programación , incluyendo Ada , C , C ++ , Objective-C , Free Pascal , Fortran , Ir , [2] y parcialmente otros. [3]
Desarrollador (es) | Proyecto GNU |
---|---|
Versión inicial | 1986 |
Lanzamiento estable | 10.1 [1] / 24 de octubre de 2020 |
Repositorio | |
Escrito en | C |
Sistema operativo | Tipo Unix , Windows |
Tipo | Depurador |
Licencia | GPLv3 |
Sitio web | www |
Historia
GDB fue escrito por primera vez por Richard Stallman en 1986 como parte de su sistema GNU , después de que su GNU Emacs fuera "razonablemente estable". [4] GDB es un software gratuito publicado bajo la Licencia Pública General GNU (GPL). Se modeló según el depurador DBX , que venía con las distribuciones Unix de Berkeley . [4]
De 1990 a 1993 fue mantenido por John Gilmore . [5] Ahora lo mantiene el Comité Directivo del BGF, designado por la Free Software Foundation . [6]
Detalles técnicos
Características
GDB ofrece amplias facilidades para rastrear y alterar la ejecución de programas de computadora . El usuario puede monitorear y modificar los valores de las variables internas de los programas , e incluso llamar a funciones independientemente del comportamiento normal del programa.
Los procesadores de destino GDB (a partir de 2003) incluyen: Alpha , ARM , AVR , H8 / 300 , Altera Nios / Nios II , System / 370 , System 390 , X86 y su extensión de 64 bits X86-64 , IA-64 "Itanium" , Motorola 68000 , MIPS , PA-RISC , PowerPC , SuperH , SPARC y VAX . Los procesadores de destino menos conocidos admitidos en la versión estándar incluyen A29K , ARC , ETRAX CRIS , D10V , D30V , FR-30 , FR-V , Intel i960 , 68HC11 , Motorola 88000 , MCORE , MN10200 , MN10300 , NS32K , Stormy16 y Z8000 . (Las versiones más recientes probablemente no admitirán algunos de estos). GDB ha compilado simuladores para procesadores de destino aún menos conocidos, como M32R o V850 . [7]
GDB todavía se está desarrollando activamente. A partir de la versión 7.0, las nuevas características incluyen soporte para scripting Python [8] y también a partir de la versión 7.8 GNU Guile scripting. [9] Desde la versión 7.0, está disponible el soporte para "depuración reversible", lo que permite que una sesión de depuración retroceda, como si se rebobinara un programa bloqueado para ver qué sucedió. [10]
Depuración remota
GDB ofrece un modo "remoto" que se utiliza a menudo al depurar sistemas integrados. La operación remota es cuando GDB se ejecuta en una máquina y el programa que se está depurando se ejecuta en otra. GDB puede comunicarse con el "stub" remoto que comprende el protocolo GDB a través de un dispositivo serie o TCP / IP. [11] Se puede crear un programa stub vinculando a los archivos stub apropiados proporcionados con GDB, que implementan el lado de destino del protocolo de comunicación. [12] Alternativamente, gdbserver se puede utilizar para depurar el programa de forma remota sin necesidad de cambiarlo de ninguna manera.
KGDB también utiliza 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 manera que depuran programas de aplicación. Hace posible colocar puntos de interrupción en el código del kernel, recorrer el código y observar variables. En arquitecturas donde los registros de depuración de hardware están disponibles, se pueden establecer puntos de vigilancia que desencadenan puntos de interrupción cuando se ejecutan o se accede a direcciones de memoria específicas. KGDB requiere una máquina adicional que está conectada a la máquina que se va a depurar mediante un cable serie o Ethernet . En FreeBSD , también es posible depurar usando el acceso directo a memoria FireWire (DMA). [13]
Interfaz gráfica del usuario
El depurador no contiene su propia interfaz gráfica de usuario y por defecto es una interfaz de línea de comandos , aunque sí contiene una interfaz de usuario de texto . Se han creado varias interfaces para él, como UltraGDB , Xxgdb , Data Display Debugger (DDD), Nemiver , KDbg , el depurador Xcode , GDBtk / Insight y HP Wildebeest Debugger GUI (WDB GUI). Los IDE como Codelite , Code :: Blocks , Dev-C ++ , Geany , GNAT Programming Studio (GPS), KDevelop , Qt Creator , Lazarus , MonoDevelop , Eclipse , NetBeans y Visual Studio pueden interactuar con GDB. GNU Emacs tiene un "modo GUD" y existen herramientas para VIM (por ejemplo, clewn). Estos ofrecen instalaciones similares a los depuradores que se encuentran en los IDE.
Algunas otras herramientas de depuración se han diseñado para funcionar con GDB, como los detectores de fugas de memoria .
Internos
GDB usa una llamada al sistema llamada ptrace (el nombre es una abreviatura de "proceso de seguimiento") para observar y controlar la ejecución de otro proceso, y examinar y cambiar la memoria y el registro del proceso. A continuación, se muestra una lista de comandos comunes de gdb y las correspondientes llamadas a ptrace:
- (gdb) start: PTRACE_TRACEME - convierte al padre en un rastreador (llamado por un rastreador)
- (gdb) adjuntar PID: PTRACE_ATTACH - adjuntar a un proceso en ejecución
- (gdb) detener: matar (child_pid, SIGSTOP) (o PTRACE_INTERRUPT)
- (gdb) continuar: PTRACE_CONT
- (gdb) registros de información: PTRACE_GET (FP) REGS (ET) y PTRACE_SET (FP) REGS (ET)
- (gdb) x: PTRACE_PEEKTEXT y PTRACE_POKETEXT
Un punto de interrupción se implementa reemplazando una instrucción en una dirección de memoria dada con otra instrucción especial. La ejecución de la instrucción de punto de interrupción provoca SIGTRAP.
Ejemplos de comandos
gdb program | Depurar "programa" (desde el shell) |
---|---|
run -v | Ejecute el programa cargado con los parámetros. |
bt | Backtrace (en caso de que el programa fallara) |
info registers | Volcar todos los registros |
disas $pc-32, $pc+32 | Desmontar |
Una sesión de ejemplo
Considere el siguiente código fuente escrito en C :
#include #include #include size_t foo_len ( const char * s ) { return strlen ( s ); }int main ( int argc , char * argv [] ) { const char * a = NULL ; printf ( "tamaño de a =% lu \ n " , foo_len ( a ) ); salir ( 0 ); }
Usando el compilador GCC en Linux , el código anterior debe compilarse usando la -g
bandera para incluir información de depuración apropiada en el binario generado, haciendo posible inspeccionarlo usando GDB. Suponiendo que se nombre el archivo que contiene el código anterior example.c
, el comando para la compilación podría ser:
$ gcc ejemplo.c -Og -g -o ejemplo
Y el binario ahora se puede ejecutar:
$ ./example Fallo de segmentación
Dado que el código de ejemplo, cuando se ejecuta, genera una falla de segmentación , GDB se puede usar para inspeccionar el problema.
$ gdb ./example GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16) Copyright (C) 2011 Free Software Foundation, Inc. Licencia GPLv3 +: GNU GPL versión 3 o posterior Este es un software gratuito: puede cambiarlo y redistribuirlo. NO HAY GARANTÍA, en la medida permitida por la ley. Escriba "mostrar copia" y "mostrar garantía" para obtener más detalles. Este GDB se configuró como "x86_64-redhat-linux-gnu". Para obtener instrucciones sobre informes de errores, consulte: ... Leer símbolos de /path/example...done. (gdb) ejecutar el programa de inicio: / ruta / ejemploPrograma recibido señal SIGSEGV, Fallo de segmentación. 0x0000000000400527 en foo_len (s = 0x0) en example.c: 8 8 return strlen (s); (gdb) imprimir 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 (en línea o no), la salida puede ser diferente, por ejemplo:
GNU gdb (GDB) 7.3.1 Copyright (C) 2011 Free Software Foundation, Inc. Licencia GPLv3 +: GNU GPL versión 3 o posterior Esto es software gratuito: usted libre de cambiarlo y redistribuirlo. NO HAY GARANTÍA, en la medida permitida por la ley. Escriba "mostrar copia" y "mostrar garantía" para obtener más detalles. Este GDB se configuró como "i686-pc-linux-gnu". Para obtener instrucciones sobre informes de errores, consulte: ... Leer símbolos de /tmp/gdb/example...done. (gdb) ejecutar el programa de inicio: / tmp / gdb / examplePrograma recibido señal SIGSEGV, Fallo de segmentación. 0xb7ee94f3 en strlen () de /lib/i686/cmov/libc.so.6 (gdb) bt # 0 0xb7ee94f3 en strlen () de /lib/i686/cmov/libc.so.6 # 1 0x08048435 en foo_len ( s = 0x0 ) en example.c: 8 # 2 0x0804845a en main ( argc = , argv = ) en example.c: 16
Para solucionar el problema, la variable a
(en la función main
) debe contener una cadena válida. Aquí hay una versión fija del código:
#include #include #include size_t foo_len ( const char * s ) { return strlen ( s ); }int main ( int argc , char * argv [] ) { const char * a = "Esta es una cadena de prueba" ; printf ( "tamaño de a =% lu \ n " , foo_len ( a ) ); salir ( 0 ); }
Recompilar y ejecutar el ejecutable nuevamente dentro de GDB ahora da un resultado correcto:
GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16)Copyright (C) 2011 Free Software Foundation, Inc.Licencia GPLv3 +: GNU GPL versión 3 o posterior < https://gnu.org/licenses/gpl.html >Este es un software gratuito: puede cambiarlo y redistribuirlo.NO HAY GARANTÍA, en la medida permitida por la ley. Escriba "mostrar copia"y "mostrar garantía" para más detalles.Este GDB se configuró como "x86_64-redhat-linux-gnu".Para obtener instrucciones sobre informes de errores, consulte:< https://www.gnu.org/software/gdb/bugs/ > ...Leyendo símbolos de /path/example...done.(gdb) ejecutarPrograma de inicio: / ruta / ejemplotamaño de a = 21[Inferior 1 (proceso 14290) salió normalmente]
GDB imprime la salida de printf
en la pantalla y luego informa al usuario que el programa salió normalmente.
Ver también
- Biblioteca de descriptores de archivos binarios (libbfd)
- dbx
- DDD , una GUI para GDB y otros depuradores
- gdbserver
Referencias
- ↑ Brobecker, Joel (24 de octubre de 2020). "¡GDB 10.1 lanzado!" . Consultado el 24 de octubre de 2020 .
- ^ "Documentación de GDB - Idiomas admitidos" . Consultado el 28 de noviembre de 2011 .
- ^ "Documentación del BGF - Resumen" . Consultado el 28 de noviembre de 2011 .
- ^ a b "Conferencia de Richard Stallman en el Real Instituto de Tecnología de Suecia (30 de octubre de 1986)" . Consultado el 21 de septiembre de 2006 .
Luego, después de que GNU Emacs estuvo razonablemente estable, lo que tomó en total aproximadamente un año y medio, comencé a volver 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.
- ^ "John Gilmore (activista)" . hyperleap.com .
- ^ "Comité Directivo del BGF" . Consultado el 11 de mayo de 2008 .
- ^ "Documentación del BGF - Resumen - Colaboradores" . Consultado el 1 de diciembre de 2011 .
- ^ "Notas de la versión de GDB 7.0" . Consultado el 28 de noviembre de 2011 .
- ^ Joel Brobecker (29 de julio de 2014). "¡GDB 7.8 lanzado!" . Consultado el 30 de julio de 2014 .
- ^ "Depuración inversa con GDB" . Consultado el 20 de enero de 2014 .
- ^ "Howto: GDB Remote Serial Protocol: Writing a RSP Server" (PDF) .
- ^ "Implementación de un stub remoto" .
- ^ "Depuración de kernel con Dcons" .
enlaces externos
- Página web oficial
- UltraGDB: depuración de Visual C / C ++ con GDB en Windows y Linux
- KGDB: depurador de nivel de fuente del kernel de Linux
- El sitio web de "MyGDB: GDB Frontend" en coreano
- Un complemento de Visual Studio para depurar con GDB
- Comparación de interfaces de GDB, 2013
- Uso de Eclipse como interfaz para el depurador de GDB
Documentación
- Richard M. Stallman , Roland Pesch , Stan Shebs , et al., Depuración con GDB ( Free Software Foundation , 2011) ISBN 978-0-9831592-3-0
- Internos de GDB
Tutoriales
- Tutorial de gdb de RMS (Ryan Michael Schmidt, no Richard Matthew Stallman )
- Tutorial de GDB