Comando gdb de Linux
Manual completo de comandos de Linux
GDB (GNU Debugger) es la herramienta de depuración de programas más utilizada en el sistema Linux. Puede ayudar a los desarrolladores a:
- Seguir el flujo de ejecución del programa
- Establecer puntos de interrupción para pausar la ejecución del programa
- Ver y modificar los valores de las variables
- Analizar las causas de los fallos del programa
- Inspeccionar la pila de llamadas de las funciones
GDB admite múltiples lenguajes de programación, incluyendo C, C++, Objective-C, Fortran, Ada, etc. Es una herramienta de depuración indispensable para los desarrolladores de Linux.
Instalar gdb
En la mayoría de las distribuciones de Linux, gdb se puede instalar fácilmente mediante el gestor de paquetes:
Ejemplo
sudo apt-get install gdb
# CentOS/RHEL
sudo yum install gdb
# Fedora
sudo dnf install gdb
# Arch Linux
sudo pacman -S gdb
Una vez completada la instalación, puedes verificar si se instaló correctamente con el siguiente comando:
gdb --version
Compilar un programa depurable
Para depurar un programa con gdb, es necesario añadir al compilar-gla opción -g para generar información de depuración:
gcc -g program.c -o program
-gLa opción -g incrusta información del código fuente en el archivo ejecutable, lo que permite a gdb correlacionar las instrucciones de máquina con el código fuente.
Comandos básicos de gdb
Iniciar y salir de gdb
Ejemplo
gdb ./program
# Iniciar gdb y adjuntarlo a un proceso en ejecución
gdb -p PID
# Salir de gdb
(gdb) quit
# o su abreviatura
(gdb) q
Ejecutar el programa
Ejemplo
(gdb) run
# o su abreviatura
(gdb) r
# Ejecutar con argumentos
(gdb) run arg1 arg2
Gestión de puntos de interrupción
Ejemplo
(gdb) break 10
# o su abreviatura
(gdb) b 10
# Establecer un punto de interrupción en la entrada de la función
(gdb) break main
(gdb) break function_name
# Ver todos los puntos de interrupción
(gdb) info breakpoints
# Eliminar puntos de interrupción
(gdb) delete 1 # Eliminar el punto de interrupción número 1
(gdb) delete # Eliminar todos los puntos de interrupción
Control de la ejecución del programa
Ejemplo
(gdb) continue
# o su abreviatura
(gdb) c
# Ejecución paso a paso (entrando en funciones)
(gdb) step
# o su abreviatura
(gdb) s
# Ejecución paso a paso (sin entrar en funciones)
(gdb) next
# o su abreviatura
(gdb) n
# Terminar de ejecutar la función actual y regresar
(gdb) finish
Ver el código
Ejemplo
(gdb) list
# o su abreviatura
(gdb) l
# Ver el código cerca de la línea especificada
(gdb) list 15
# Ver el código de la función especificada
(gdb) list main
Examinar variables y memoria
Ejemplo
(gdb) print variable_name
# o su abreviatura
(gdb) p variable_name
# Modificar el valor de la variable
(gdb) print variable_name = new_value
# Ver el tipo de la variable
(gdb) ptype variable_name
# Ver el contenido de la memoria
(gdb) x/10xw &variable # Ver 10 palabras (word) en hexadecimal
Análisis de la pila de llamadas
Ejemplo
(gdb) backtrace
# o su abreviatura
(gdb) bt
# Cambiar al marco de pila especificado
(gdb) frame 2
# o su abreviatura
(gdb) f 2
Técnicas avanzadas de depuración
Puntos de interrupción condicionales
Ejemplo
(gdb) break 10 if i == 5
Puntos de observación
Ejemplo
(gdb) watch variable_name
# Pausar cuando la variable sea leída
(gdb) rwatch variable_name
# Pausar cuando la variable sea leída o modificada
(gdb) awatch variable_name
Depuración multihilo
Ejemplo
(gdb) info threads
# Cambiar al hilo especificado
(gdb) thread 2
# Permitir solo la ejecución del hilo actual
(gdb) set scheduler-locking on
Depurar archivos de volcado de núcleo (core dump)
Ejemplo
gdb ./program core
# Ver la pila de llamadas en el momento del fallo
(gdb) bt
Interfaz gráfica de gdb
gdb también admite el modo de interfaz gráfica. Se puede iniciar con-tuila opción -tui:
gdb -tui ./program
O cambiar durante el uso:
Ejemplo
(gdb) layout asm # Mostrar la ventana del ensamblador
(gdb) layout regs # Mostrar la ventana de registros
(gdb) layout split # Mostrar el código fuente y el ensamblador simultáneamente
Configuración práctica de gdb
Puedes añadir las configuraciones de uso común al~/.gdbinitarchivo ~/.gdbinit:
Ejemplo
set print pretty on
# Establecer el tamaño del historial
set history save on
set history size 1000
# Personalizar comandos
define printarray
set $i = 0
while $i < $arg0
printf "array[%d] = %dn", $i, $arg1[$i]
set $i = $i + 1
end
end
Resolución de problemas comunes
No se ve el código fuente durante la depuración
- Asegúrate de haber usado al compilar
-gla opción -g. - Comprueba que el código fuente esté en la ubicación que tenía al compilar
- Usa el comando
directorydirectory para añadir la ruta del código fuente:
(gdb) directory /path/to/source
Depurar código optimizado
La optimización puede cambiar el orden de ejecución del código, lo que dificulta la depuración. Se recomienda desactivar la optimización al depurar:
gcc -O0 -g program.c -o program
Resumen
gdb es una poderosa herramienta de depuración en Linux; dominarla puede mejorar significativamente la eficiencia de la depuración. Este artículo presenta el uso básico y los comandos comunes de gdb. Se recomienda a los lectores consolidar estos conocimientos mediante la práctica real de depuración. Con la acumulación de experiencia, descubrirás que gdb puede ayudarte a resolver diversos problemas complejos de depuración.
Otras extensiones