Comando gdb de Linux

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

# Ubuntu/Debian
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

# Iniciar gdb y cargar el programa
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

# Ejecutar el programa
(gdb) run
# o su abreviatura
(gdb) r

# Ejecutar con argumentos
(gdb) run arg1 arg2

Gestión de puntos de interrupción

Ejemplo

# Establecer un punto de interrupción en la línea especificada
(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

# Continuar la ejecución hasta el siguiente punto de interrupción
(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

# Ver el código cerca de la línea actual
(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

# Imprimir el valor de la variable
(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

# Ver la pila de llamadas
(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

# Activar el punto de interrupción cuando i sea igual a 5
(gdb) break 10 if i == 5

Puntos de observación

Ejemplo

# Pausar cuando la variable sea modificada
(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

# Ver todos los hilos
(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

# Cargar el archivo de volcado de núcleo
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 src  # Mostrar la ventana del código fuente
(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

# Mostrar impresión bonita (pretty printing)
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

  1. Asegúrate de haber usado al compilar-gla opción -g.
  2. Comprueba que el código fuente esté en la ubicación que tenía al compilar
  3. Usa el comandodirectorydirectory 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.


Linux 命令大全Manual completo de comandos de Linux

Otras extensiones