Depurador GNU
El GNU Debugger (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, C, C++, Objective -C, Free Pascal, Fortran, Go y parcialmente otros.
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". GDB es software libre publicado bajo la Licencia Pública General GNU (GPL). Se inspiró en el depurador DBX, que venía con las distribuciones Berkeley Unix.
De 1990 a 1993 fue mantenido por John Gilmore. Ahora lo mantiene el Comité Directivo de GDB, que es designado por la Free Software Foundation.
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 los programas' variables internas, 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. (Es probable que las versiones más recientes no admitan algunos de estos). GDB ha compilado simuladores para procesadores de destino incluso menos conocidos, como M32R o V850.
GDB todavía se está desarrollando activamente. A partir de la versión 7.0, las nuevas funciones incluyen soporte para secuencias de comandos Python y, a partir de la versión 7.8, también secuencias de comandos GNU Guile. Desde la versión 7.0, la compatibilidad con "depuración reversible" — permitir que una sesión de depuración retroceda, como si se rebobinara un programa bloqueado para ver qué sucedió — está disponible.
Depuración remota
GDB ofrece un "control remoto" El modo se usa 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" que entienda el protocolo GDB a través de un dispositivo serial o TCP/IP. Se puede crear un programa stub mediante un enlace a los archivos stub apropiados provistos con GDB, que implementan el lado objetivo del protocolo de comunicación. Alternativamente, gdbserver se puede usar 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 origen con gdb. Con KGDB, los desarrolladores del kernel pueden depurar un kernel de la misma manera que depuran los programas de aplicación. Hace posible colocar puntos de interrupción en el código del núcleo, 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 observación 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) de FireWire.
Interfaz gráfica de usuario
El depurador no contiene su propia interfaz gráfica de usuario y por defecto es una interfaz de línea de comandos, aunque contiene una interfaz de usuario de texto. Se han creado varios front-end para él, como UltraGDB, Xxgdb, Data Display Debugger (DDD), Nemiver, KDbg, el depurador Xcode, GDBtk/Insight, Seer 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 han sido diseñadas 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 "rastreo de proceso") 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 incluye una lista de los comandos gdb comunes y las llamadas ptrace correspondientes:
- (gdb) start: PTRACE_TRACEME – hace de padre un trazador (llamado por un trazo)
- (gdb) adjuntar PID: PTRACE_ATTACH – adjuntar a un proceso de ejecución
- (gdb) stop: kill(child_pid, SIGSTOP) (or PTRACE_INTERRUPT)
- (gdb) continue: PTRACE_CONT
- (gdb) info registers: 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 al reemplazar una instrucción en una dirección de memoria determinada con otra instrucción especial. La ejecución de la instrucción de punto de interrupción provoca SIGTRAP.
Ejemplos de comandos
gdb program | Debug "programa" (de la cáscara) |
---|---|
run -v | Ejecute el programa cargado con los parámetros |
bt | Backtrace (en caso de que el programa se estrellara) |
info registers | Bombarde todos los registros |
disas $pc-32, $pc+32 | Disassemble |
Una sesión de ejemplo
Considere el siguiente código fuente escrito en C:
#include Identificado.h#include ■stdlib.h#include Identificando.hsize_t Foo_len() const char *s ){} retorno strlen() s );}int principal() int argc, char *argv[] ){} const char *a = NULL; printf() "Tamaño de a = %lun", Foo_len()a) ); Salida() 0 );}
Usando el compilador GCC en Linux, el código anterior debe compilarse usando el indicador -g
para incluir información de depuración adecuada en el binario generado, lo que hace posible 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 example.c -Og -g -o example
Y ahora se puede ejecutar el binario:
$ ./ejemplo
Fallo de segmentación
Dado que el código de ejemplo, cuando se ejecuta, genera una falla de segmentación, GDB puede usarse 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 version 3 or later ■https://gnu.org/licenses/gpl.htmlEsto es software libre: usted es libre de cambiar y redistribuirlo.No hay urgencia, en la medida en que lo permita la ley. Tipo "show copying"y "Mostrar garantía" para detalles.Este GDB fue configurado como "x86_64-redhat-linux-gnu".Para instrucciones de presentación de errores, consulte:■https://www.gnu.org/software/gdb/bugs/año...Leyendo símbolos de /path/example...done.(gdb) CorrePrograma de inicio: /path/exampleEl programa recibió señal SIGSEGV, falta de Segmentación.0x0000000400527 en foo_len (s=0x0) en el ejemplo.c:77 strlen (s);(gdb) impresión$1 = 0x0
El problema está presente en la línea 7, 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.1Copyright (C) 2011 Free Software Foundation, Inc.Licencia GPLv3+: GNU GPL version 3 or later ■https://gnu.org/licenses/gpl.htmlEsto es software libre: usted es libre de cambiar y redistribuirlo.No hay urgencia, en la medida en que lo permita la ley. Tipo "show copying"y "Mostrar garantía" para detalles.Este GDB fue configurado como "i686-pc-linux-gnu".Para instrucciones de presentación de errores, consulte:■https://www.gnu.org/software/gdb/bugs/año...Leyendo símbolos de /tmp/gdb/example...done.(gdb) CorrePrograma de inicio: /tmp/gdb/exampleEl programa recibió señal SIGSEGV, falta de Segmentación.0xb7ee94f3 en strlen () de /lib/i686/cmov/libc.so.6(gdb) bt#0 0xb7ee94f3 dentro strlen () de /lib/i686/cmov/libc.so.6
#1 0x08048435 dentro Foo_len ()s=0x0) en el ejemplo.c:7
#2 0x0804845a dentro principal ()argc=- No. argv=■optimized out) en el 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:
#include Identificado.h#include ■stdlib.h#include Identificando.hsize_t Foo_len() const char *s ){} retorno strlen()s);}int principal() int argc, char *argv[] ){} const char *a = "Esto es una cuerda de prueba"; printf() "Tamaño de a = %lun", Foo_len()a) ); Salida() 0 );}
Volver a compilar y ejecutar el ejecutable 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 version 3 or later ■https://gnu.org/licenses/gpl.html Esto es software libre: usted es libre de cambiar y redistribuirlo. No hay urgencia, en la medida en que lo permita la ley. Tipo "show copying" y "Mostrar garantía" para detalles. Este GDB fue configurado como "x86_64-redhat-linux-gnu". Para instrucciones de presentación de errores, consulte: ■https://www.gnu.org/software/gdb/bugs/año... Leyendo símbolos de /path/example...done. (gdb) run Programa de inicio: /path/example tamañ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.
Contenido relacionado
Verdadero BÁSICO
BeBox
AWK