El depurador GNU ( GDB ) es un depurador portátil que se ejecuta en muchos sistemas tipo Unix y funciona con 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 ] Detecta problemas en un programa mientras se ejecuta y permite a los usuarios examinar las variables del programa y los registros de la máquina.
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 software libre distribuido bajo la Licencia Pública General de 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 es mantenido por el Comité Directivo de GDB, que es designado por la Free Software Foundation . [ 6 ]
Características técnicas
GDB ofrece amplias herramientas para rastrear, examinar y modificar la ejecución de programas informáticos . El usuario puede supervisar y modificar los valores de las variables internas de los programas , e incluso llamar a funciones independientemente del comportamiento normal del programa.
Plataformas compatibles
Procesadores de destino de GDB ( a partir de 2003))Incluye: Alpha , ARM , AVR , H8/300 , Altera Nios / Nios II , System/370 , System/390 , x86 ( 32 bits y 64 bits ), IA-64 "Itanium", Motorola 68k , MIPS , PA-RISC , PowerPC , RISC-V , SuperH , SPARC y VAX . Los procesadores de destino menos conocidos compatibles en la versión estándar han incluido 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 sean compatibles con algunos de estos).
GDB tiene simuladores compilados para la mayoría de los objetivos. [ 7 ]
Recorriendo el código paso a paso
Ambos comandos se pueden usar para avanzar la ejecución a través de las siguientes n instrucciones. Si se omite n, se toma el valor predeterminado de 1. La diferencia entre los comandos es que step seguirá el flujo de ejecución dentro de las partes internas de cualquier llamada a función, mientras que next ejecutará toda la función y pasará a la siguiente instrucción dentro de la rutina actual. [ 8 ]next nstep n
El comando se utiliza para omitir una sección de código problemático o para volver a una instrucción anterior y revisar la ejecución nuevamente. La ubicación especificada puede corresponder a diferentes partes del programa en ejecución, pero pueden producirse resultados inesperados para quienes no estén familiarizados con el código máquina . [ 9 ]jump location
Imprimir valores y expresiones
Cuando un programa se detiene a mitad de su ejecución, el comando `print` (abreviado como `p` ) permite mostrar el valor de una variable o una expresión utilizando la sintaxis de C o C++. El comando `x` (que significa "examinar") es similar, pero su argumento es una dirección de memoria, incluyendo expresiones de dirección. Ambos comandos utilizan indicadores para especificar el formato de presentación de la salida, aunque existen algunas diferencias, ya que `x` permite especificar el número de bytes.
p.ej:
print /f myVar #Imprime un número de punto flotante de doble precisión x /8bx &foo #Imprime 8 bytes en formato hexadecimal comenzando en la ubicación de memoria de foo
Además, el comando de llamada invoca funciones tanto de la biblioteca como escritas por el usuario, y el valor devuelto se mostrará. [ 10 ]
Los valores mostrados se asignan automáticamente a variables especiales de historial de valores que comienzan con un signo $ seguido de un número de secuencia que luego se puede volver a mostrar usando print . [ 10 ] : 547 [ 11 ]
es decir:
llamar a getpid() $1 = 23995
También se puede usar el comando set para crear variables de conveniencia para usar durante una sesión de gdb. [ 12 ]
p.ej:
establecer $foo=i+42
Si el argumento de print es un array o una estructura, se mostrarán todos los elementos. La siguiente sintaxis se puede utilizar para mostrar un subrango del array:
es decir:
print myArray[10]@10 #muestra 10 elementos del array comenzando en myArray[4] [ 10 ] : 546
Puntos de interrupción y puntos de vigilancia
Los puntos de interrupción y los puntos de observación se utilizan para examinar un programa antes de que se produzca un error. Tanto los puntos de interrupción como los puntos de observación emiten números de identificación enteros (1, 2, 3...) que permiten activarlos, desactivarlos o eliminarlos . El comando muestra todos los puntos de interrupción y su estado actual.info break|watch
Los puntos de interrupción se configuran para detener la ejecución del código en líneas específicas o al entrar en una función cuando se ejecuta dentro del depurador; por ejemplo, se detendrá en la línea 42 del archivo especificado. Si se omite el nombre del archivo, se hace referencia al archivo actual.breaksourcefile:42
Un punto de interrupción condicional se detiene en una línea específica cuando una expresión específica es verdadera, es decir:
break sourcefile :275 if productNum =1275
El comando permite agregar condiciones a un punto de interrupción establecido. [ 13 ]conditionbreakNumexpression
Los puntos de observación detienen la ejecución cuando cambia el valor de una variable o una expresión, independientemente de la ubicación del cambio en el programa. Por defecto, siempre que sea posible, gdb monitoriza la ubicación de memoria donde se produce el cambio, una función útil dado que varios punteros pueden apuntar a la misma dirección. Por el contrario, los puntos de observación por software, que son más lentos, solo monitorizan las variables.
Los comandos rwatch y awatch detendrán el programa cada vez que se lea la ubicación de memoria o la variable. [ 14 ]
Otra característica condicional tanto de los relojes como de los puntos de interrupción es el comando que ignora los criterios de detención hasta que pase el recuento de ejecuciones. [ 15 ]ignorebreakNumcount
El comando display prepara a gdb para que muestre automáticamente el valor de una expresión cada vez que se detiene. Varios comandos display son acumulativos y la salida se puede formatear utilizando las mismas opciones disponibles para el comando x . [ 10 ] : 551–552
Pilas de marcos
Cuando un programa se detiene, puede encontrarse en varias capas de llamadas a funciones. Cada nivel de llamada a función se denomina marco y el conjunto de marcos se denomina pila de marcos. Al detenerse la ejecución, se puede navegar hacia arriba o hacia abajo a un marco específico para examinar el valor de las variables o expresiones en un nivel determinado, lo cual resulta útil para depurar programas. El comando `backtrace` proporciona una lista de todos los marcos en la pila. El comando `info args` muestra todos los argumentos pasados al marco actual y el comando `info local` muestra una lista de las variables disponibles junto con sus valores. [ 16 ]
Soporte para scripts
GDB incluye la capacidad de definir rutinas de comandos que se pueden usar para automatizar conjuntos de instrucciones gdb que se repiten con frecuencia. Estas consisten en comandos gdb colocados entredefinir yinstrucciones de fin . Los parámetros de estas rutinas no se declaran por nombre, sin embargo, se pasan en variables especiales $arg1, $arg2, $arg3 ... con la variable especial $ argc que representa el número de argumentos de la línea de comandos.
Además, gdb incluyesi /otra cosa ymientras que los bloques terminados porde finasí comoloop_break yInstrucciones loop_continue para gestionar el flujo de control. [ 17 ]
p.ej:
# Script para configurar el indicador de gdb y establecer un punto de interrupción define cmd establecer mensaje "Mi depurador>" establecer imprimir bonito # mostrar estructuras en varias líneas si $argc==0 Imprimir "No hay argumentos para el comando" de lo contrario, romper $arg0 fin fin
Consideremos que se está depurando un programa C con una lista enlazada genérica , un valor principal yEl siguiente campo apunta al siguiente elemento, el siguiente comando usaría unbucle while para mostrar todos los elementos: [ 18 ]
definir p_generic_list establecer var $n = $arg0 mientras $n imprimir *($n) establecer var $n = $n->next fin fin
Las definiciones de comandos ubicadas en el archivo local .gdbinit se cargan automáticamente al inicio de la sesión de gdb. Las definiciones de comandos también se pueden guardar en archivos normales y cargarse mediante el comando source .
A partir de la versión 7.0, las nuevas características incluyen soporte para scripts de Python [ 19 ] y, a partir de la versión 7.8, también para scripts de GNU Guile , que se basa en Scheme (lenguaje de programación) . [ 20 ]
Depuración reversible
Desde la versión 7.0, está disponible la compatibilidad con la "depuración reversible", que permite retroceder en la ejecución de una sesión de depuración, de forma similar a rebobinar un programa que se ha bloqueado para ver qué ha ocurrido. Esta función consume mucha memoria y ralentiza la ejecución, con un límite predeterminado de 20 000 instrucciones. El procedimiento recomendado consiste en establecer puntos de interrupción antes y después del problema detectado, y luego ejecutar el comando de grabación cuando el programa se detenga en el primero. Continúe la ejecución hasta el segundo punto de interrupción. Los comandos `reverse-step` , `reverse-next` y `reverse-continue` se pueden utilizar para retroceder en la ejecución, deshaciendo los cambios en las variables de forma gradual. Sin embargo, la depuración inversa no deshace acciones como la salida de la consola ni vuelve a emitir eventos externos como interrupciones o paquetes de red entrantes. [ 13 ] : 80-82 [ 21 ]
Depuración remota
GDB ofrece un modo "remoto" que se usa frecuentemente para depurar sistemas embebidos. En el modo remoto, 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 entiende el protocolo GDB a través de un dispositivo serie o TCP/IP. [ 22 ] Se puede crear un programa stub enlazándolo con los archivos stub correspondientes que proporciona GDB, los cuales implementan la parte del protocolo de comunicación que corresponde al sistema. [ 23 ] Alternativamente, se puede usar gdbserver para depurar el programa de forma remota sin necesidad de modificarlo.
KGDB también utiliza este mismo modo para depurar un kernel de Linux en ejecución a nivel de código fuente con gdb. Con KGDB, los desarrolladores de kernels pueden depurarlo de forma muy similar a como depuran programas de aplicación. Permite colocar puntos de interrupción en el código del kernel, recorrer el código paso a paso y observar variables. En arquitecturas con registros de depuración de hardware disponibles, se pueden establecer puntos de observación que activan puntos de interrupción cuando se ejecutan o acceden a direcciones de memoria específicas. KGDB requiere una máquina adicional conectada a la máquina que se va a depurar mediante un cable serie o Ethernet . En FreeBSD , también es posible depurar mediante acceso directo a memoria (DMA) FireWire . [ 24 ]
Interfaz gráfica de 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í incluye una interfaz de texto . Se han creado varias interfaces para él, como UltraGDB, Xxgdb, Data Display Debugger (DDD), Nemiver, KDbg, el depurador de Xcode , GDBtk/Insight, Gede, [ 25 ] Seer, [ 26 ] 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). Estas ofrecen funcionalidades similares a las de los depuradores que se encuentran en los IDE.
Se han diseñado otras herramientas de depuración para que funcionen con GDB, como por ejemplo los detectores de fugas de memoria .
Interiores
GDB utiliza una llamada al sistema denominada ptrace (el nombre es una abreviatura de "seguimiento de proceso") para observar y controlar la ejecución de otro proceso, así como para examinar y modificar 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 por otra instrucción especial. La ejecución de la instrucción del punto de interrupción provoca una señal SIGTRAP.
Véase también
- Biblioteca de descriptores de archivos binarios (libbfd)
- dbx
- DDD , una interfaz gráfica de usuario para GDB y otros depuradores.
- gdbserver
- LLDB
Referencias
- ↑ Joël Brobecker (10 de mayo de 2026). "¡GDB 17.2 lanzado!" . Consultado el 10 de mayo de 2026 .
- ↑ "Documentación de GDB - Idiomas compatibles" . sourceware.org . Archivado del original el 28/12/2017 . Consultado el 16/06/2025 .
- ↑ "Documentación de GDB - Resumen" . sourceware.org . Archivado del original el 1 de julio de 2012. Consultado el 16 de junio de 2025 .
- 1 2 "Conferencia de Richard Stallman en el Real Instituto de Tecnología de Suecia (30-10-1986)" . Recuperado el 21-09-2006 .
Luego, una vez que GNU Emacs fue razonablemente estable, lo que tomó en total alrededor de un año y medio, comencé a retomar otras partes del sistema. Desarrollé un depurador que llamé GDB, que es un depurador simbólico para código C, que recientemente entró en distribución. Ahora 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 . Archivado del original el 26 de febrero de 2021. Consultado el 13 de octubre de 2020 .
- ↑ "Comité Directivo del GDB" . Consultado el 11 de mayo de 2008 .
- ↑ "19.2 Comandos para administrar objetivos" . Depuración con GDB . Free Software Foundation, Inc. 2026. Consultado el 7 de enero de 2026. GDB
incluye simuladores para la mayoría de las arquitecturas.
- ↑ "Continuing and Stepping" . Free Software Foundation. 2025. Consultado el 22 de junio de 2025 .
- ↑ "Continuando en una dirección diferente" . Free Software Foundation. 2025. Consultado el 22 de junio de 2025 .
- 1 2 3 4 Fusco, John (2007). The Linux Programmer's Toolbox . Prentice Hall. págs. 542–547 . ISBN 978-0-13-219857-8.
- ↑ "Variables de conveniencia" . Free Software Foundation Inc. 2025. Consultado el 25 de septiembre de 2025 .
- ↑ Keren, Guy (4 de abril de 2009). "Variables de conveniencia" . Recuperado el 25 de septiembre de 2025 .
- 1 2 Diomidis, Spinellis (2017). Depuración eficaz . Pearson Education. págs. 77–79 . ISBN 978-0-13-439479-4.
- ↑ "Establecimiento de puntos de vigilancia" . 2025. Consultado el 29 de junio de 2025 .
- ↑ "Condiciones de descanso" . 2025. Consultado el 29 de junio de 2025 .
- ↑ "Depuración con GDB: Examinando la pila" . web.mit.edu . Consultado el 10 de noviembre de 2025 .
- ↑ "Archivos de comandos" . sourceware.org . Consultado el 7 de octubre de 2025 .
- ↑ Shriraman, Arrvindh; Whiller, Liz (7 de octubre de 2025). "Depuración de listas enlazadas" . Recuperado el 7 de octubre de 2025 .
- ↑ "Notas de la versión de GDB 7.0" . Consultado el 28 de noviembre de 2011 .
- ↑ Joel Brobecker (29-07-2014). "¡GDB 7.8 lanzado!" . Consultado el 30-07-2014 .
- ↑ "Depuración inversa con GDB" . Consultado el 20 de enero de 2014 .
- ↑ "Cómo: Protocolo serie remoto GDB: Cómo escribir un servidor RSP" (PDF) .
- ↑ "Implementación de un stub remoto" .
- ↑ "Depuración del kernel con Dcons" .
- ↑ "Sitio web oficial de Gede" . Consultado el 7 de junio de 2025 .
- ↑ "Seer - una interfaz gráfica para gdb" . Repositorio de Github de Seer .
- ↑ O'Neill, Ryan (29 de febrero de 2016). "3". Aprendiendo análisis binario de Linux . Packt Publishing. ISBN 978-1-78216-710-5.
Enlaces externos
- Sitio web oficial ,repositorio Git oficial de GDB
- UltraGDB: Depuración de Visual C/C++ con GDB en Windows y Linux. Archivado el 12/12/2017 en Wayback Machine.
- El sitio web de "MyGDB: GDB Frontend" en idioma coreano.
- Un complemento de Visual Studio para depurar con 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
- Componentes internos de GDB
Tutoriales
- Tutorial de gdb de RMS (Ryan Michael Schmidt, no Richard Matthew Stallman )
- Tutorial de GDB
- Uso de Eclipse como interfaz para el depurador GDB
- Depuradores
- Software del Proyecto GNU
- Herramientas de programación Unix
- Software de desarrollo de videojuegos para Linux
- Software que fue reescrito en C++
- Software libre programado en C
- Software que utiliza la Licencia Pública General de GNU.