stringtranslate.com

Depurador GNU

El depurador GNU ( GDB ) es un depurador portátil que se ejecuta en muchos sistemas similares a Unix y funciona para muchos lenguajes de programación , incluidos Ada , Assembly , C , C++ , D , Fortran , Haskell , Go , Objective-C , OpenCL C , Modula. -2 , Pascal , Rust , [2] y parcialmente otros. [3]

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). Fue modelado a partir del depurador DBX , que venía con las distribuciones Berkeley Unix . [4]

De 1990 a 1993 fue mantenido por John Gilmore . [5] Ahora lo mantiene el Comité Directivo del BGF, designado por la Fundación de Software Libre . [6]

Detalles técnicos

Características

GDB ofrece amplias instalaciones para rastrear y alterar la ejecución de programas informáticos . El usuario puede monitorear y modificar los valores de las variables internas de los programas , e incluso llamar 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 . (Es probable que las versiones más recientes no admitan algunos de estos). GDB ha compilado simuladores incluso para procesadores de destino menos conocidos, como M32R o V850 . [7]

El BGF todavía se está desarrollando activamente. A partir de la versión 7.0, las nuevas características incluyen soporte para secuencias de comandos Python [8] y, a partir de la versión 7.8, también secuencias de comandos GNU Guile . [9] Desde la versión 7.0, está disponible el soporte para la "depuración reversible", que permite que una sesión de depuración retroceda, de forma muy similar a rebobinar 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 vinculándolo 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 remotamente el programa 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 origen con gdb. Con KGDB, los desarrolladores del kernel pueden depurar un kernel de la misma manera que depuran programas de aplicación. Permite 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 activan 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 utilizando el acceso directo a memoria (DMA) FireWire . [13]

Interfaz gráfica del usuario

El depurador no contiene su propia interfaz gráfica de usuario y por defecto utiliza una interfaz de línea de comandos , aunque sí contiene una interfaz de usuario de texto . Se han creado varias interfaces para ello, como UltraGDB, Xxgdb, Data Display Debugger (DDD), Nemiver , KDbg, el depurador Xcode , GDBtk/Insight, Seer y HP Wildebeest Debugger GUI (WDB GUI). 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 utiliza una llamada al sistema llamada ptrace (el nombre es una abreviatura de "rastreo de proceso") para observar y controlar la ejecución de otro proceso, y examinar y cambiar la memoria y los registros del proceso.

Un punto de interrupción se implementa reemplazando una instrucción en una dirección de memoria determinada con otra instrucción especial. La ejecución de una instrucción de punto de interrupción provoca SIGTRAP.

Ejemplos de comandos

Una sesión de ejemplo

Considere el siguiente código fuente escrito en C :

#incluye <stdio.h> #incluye <stdlib.h> #incluye <cadena.h>   size_t foo_len ( const char * s ) { return strlen ( s ); }         int principal ( 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 el -gindicador para incluir información de depuración adecuada en el binario generado, haciendo posible inspeccionarlo usando GDB. Suponiendo que el archivo que contiene el código anterior se llame example.c, el comando para la compilación podría ser:

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

Y ahora se puede ejecutar el binario:

$ ./ejemplo Fallo de segmentación

Dado que el código de ejemplo, cuando se ejecuta, genera un error de segmentación , se puede utilizar GDB para inspeccionar el problema.

$ gdb  ./ejemplo 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 software gratuito: usted es 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 "x86_64-redhat-linux-gnu". Para obtener instrucciones sobre informes de errores, consulte: <https://www.gnu.org/software/gdb/bugs/>... Lectura de símbolos de /path/example...done. (gdb)  ejecute el programa inicial: /ruta/ejemploEl programa recibió la señal SIGSEGV, falla de segmentación. 0x0000000000400527 en foo_len (s=0x0) en ejemplo.c:7 7 return strlen (s); (gdb)  imprimir s $ 1 = 0x0  

El problema está presente en la línea 7 y ocurre al llamar a la función strlen(porque su argumento, ses 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 <https://gnu.org/licenses/gpl.html> Este 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: <https://www.gnu.org/software/gdb/bugs/>... Lectura de símbolos de /tmp/gdb/example...done. (gdb)  ejecute el programa de inicio: /tmp/gdb/exampleEl programa recibió la señal SIGSEGV, falla 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 ejemplo.c:7 # 2 0x0804845a en principal ( argc = <salida optimizada >, argv = <salida optimizada > ) en ejemplo.c:14                    

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:

#incluye <stdio.h> #incluye <stdlib.h> #incluye <cadena.h>   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:

$ gdb  ./ejemplo 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 software gratuito: usted es 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 "x86_64-redhat-linux-gnu". Para obtener instrucciones sobre informes de errores, consulte: <https://www.gnu.org/software/gdb/bugs/>... Lectura de símbolos de /path/example...done. (gdb)  ejecutar Programa inicial: /ruta/ tamaño de ejemplo de a = 21 [Inferior 1 (proceso 14290) salió normalmente]

GDB imprime el resultado printfen la pantalla y luego informa al usuario que el programa salió normalmente.

Ver también

Referencias

  1. ^ Joël Brobecker (7 de julio de 2024). "¡Se lanzó GDB 15.1!" . Consultado el 9 de julio de 2024 .
  2. ^ "Documentación de GDB: idiomas admitidos". Archivado desde el original el 28 de diciembre de 2017 . Consultado el 28 de noviembre de 2011 .
  3. ^ "Documentación del BGF - Resumen". Archivado desde el original el 1 de julio de 2012 . Consultado el 28 de noviembre de 2011 .
  4. ^ ab "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 alrededor de un año y medio, 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 sigue en gran medida el espíritu de DBX, que es un depurador que viene con Berkeley Unix.
  5. ^ "John Gilmore (activista)". hiperleap.com . Archivado desde el original el 26 de febrero de 2021 . Consultado el 13 de octubre de 2020 .
  6. ^ "Comité Directivo del BGF" . Consultado el 11 de mayo de 2008 .
  7. ^ "Documentación del BGF - Resumen - Colaboradores". Archivado desde el original el 29 de septiembre de 2011 . Consultado el 1 de diciembre de 2011 .
  8. ^ "Notas de la versión de GDB 7.0" . Consultado el 28 de noviembre de 2011 .
  9. ^ Joel Brobecker (29 de julio de 2014). "¡Lanzamiento de GDB 7.8!" . Consultado el 30 de julio de 2014 .
  10. ^ "Depuración inversa con GDB" . Consultado el 20 de enero de 2014 .
  11. ^ "Cómo: Protocolo serie remoto GDB: escritura de un servidor RSP" (PDF) .
  12. ^ "Implementación de un código auxiliar remoto".
  13. ^ "Depuración del kernel con Dcons".

enlaces externos

Documentación

Tutoriales