CGDB: Interfaz visual para la depuración con GDB

Para analizar el comportamiento de aplicaciones en C/C++ en sistemas Unix, GDB es la herramienta estándar. CGDB actúa como una capa de interfaz en modo texto (TUI) que mejora la experiencia al mostrar el código fuente sincronizado con los comandos de depuración. La instalación se realiza mediante los gestores de paquetes estándar.

Preparación del entorno

En sistemas basados en Debian o Arch Linux, utiliza los siguientes comandos para instalar el depurador y el compilador:

# Debian / Ubuntu
sudo apt update && sudo apt install gdb cgdb build-essential

# Arch Linux
sudo pacman -S gdb cgdb gcc

Verifica la instalación ejecutando gdb --version y cgdb --version desde la terminal.

Inclusión de símbolos de depuración

Es imprescindible compilar el binario incluyendo información de depuración mediante el flag -g. Se recomienda desactivar la optimización del compilador con -O0 para que el flujo de ejecución coincida exactamente con el código fuente.

gcc -g -O0 programa.c -o programa

Comandos fundamentales de GDB

  • run (r): Inicia la ejecución del programa. Permite pasar argumentos, ej. r arg1.
  • break (b): Establece un punto de interrupción. Acepta números de línea (b 20) o nombres de funciones (b main).
  • continue (c): Reanuda la ejecución hasta el siguiente punto de interrupción.
  • next (n): Ejecuta la siguiente línea sin entrar en el cuerpo de las funciones.
  • step (s): Ejecuta la siguiente línea entrando en el cuerpo de las funciones.
  • print (p): Evalúa e imprime el valor de una variable o expresión, ej. p contador.
  • backtrace (bt): Muestra la pila de llamadas de funciones actual.
  • frame (f): Cambia el contexto a un marco específico de la pila, ej. f 1.
  • list (l): Muestra el código fuente alrededor de la línea en ejecución.

Exploración de la interfaz de CGDB

Al iniciar CGDB (cgdb ./programa), la terminal se divide en dos secciones: la mitad superior muestra el código fuente con resaltado de sintaxis, y la mitad inferior proporciona el prompt interactivo de GDB.

La navegación entre ventanas y el control de la ejecución se gestionan principalmente mediante atajos de teclado:

  • Esc: Transfiere el foco a la ventana de código fuente, permitiendo navegar por el archivo.
  • i: Devuelve el foco a la consola de GDB para escribir comandos.
  • Espacio: Activa o desactiva un punto de interrupción en la línea donde se encuentra el cursor.
  • F5: Equivalente a run.
  • F6: Equivalente a continue.
  • F7: Equivalente a step.
  • F8: Equivalente a next.

Ejemplo práctico de depuración

Considere el siguiente código fuente con un error de acceso a memoria fuera de límites:

#include <stdio.h>

int calcular_producto(int x, int y) {
    return x * y;
}

int main() {
    int valores[4] = {10, 20, 30, 40};
    int indice = 0;

    // Error: la condición incluye el índice 4
    while(indice <= 4) {
        printf("valores[%d] = %d\n", indice, valores[indice]);
        indice++;
    }

    int total = calcular_producto(5, 5);
    printf("Total: %d\n", total);
    return 0;
}

Compile el código con gcc -g -O0 programa.c -o programa y ejecútelo con cgdb ./programa. Siga estos pasos:

  1. Pulse i para enfocar la consola de GDB.
  2. Escriba b main y luego r para iniciar la ejecución.
  3. Use F6 para avanzar hasta el bucle while.
  4. Presione F8 repetidamente para iterar. En cada pausa, verifique el valor de indice escribiendo p indice.
  5. Cuando el programa intanta acceder a valores[4], se producirá un fallo de segmentación. Escriba bt para inspeccionar la pila de llamadas y determinar la línea exacta del error.

Escenarios comunes de depuración

Fallos de segmentación (Segmentation Fault): Cuando el progarma falla, ejecute bt para visualizar la pila de ejecución. Utilice f 0 para situarse en el marco donde ocurrió el incidente y l para examinar el código fuente adyacente.

Bucles infinitos: Si la aplicación deja de responder, interrumpa la ejecución con Ctrl+C, inspeccione las variables de control con p y, si es necesario, fuerce su modificación para salir del bucle usando set var indice = 100. Luego reanude con c.

Puntos de interrupción condicionales: Para detener la ejecución solo cuando se cumple un criterio específico, utilice la sintaxis b número_línea if condición. Por ejemplo: b 12 if indice == 3.

Funcionalidades avanzadas

  • watch expresión: Pausa el programa automáticamente cuando el valor de la expresión o variable es modificado.
  • rwatch expresión: Se activa cuando la variable es leída.
  • display variable: Imprime el valor de la variable de forma automática cada vez que el programa se detiene.
  • info locals: Lista todas las variables localess del marco de pila actual.
  • thread apply all bt: Imprime la traza de pila de todos los hilos en aplicaciones multihilo.

Etiquetas: GDB CGDB C/C++ depuración linux

Publicado el 6-26 21:53