Volver al inicio

Depuración con GDB en C++: encuentra el segfault en minutos

Guía de GDB para desarrolladores de C++ enfocada en encontrar segfault, configurar breakpoints, visualizar variables y modo TUI. Basada en ejemplos reales de crashes y navegación de código sin recompilaciones.

GDB en C++: desde segfault hasta depuración rápida
Advertisement 728x90

GDB: Depuración paso a paso en C++ sin miedo a fallos de segmentación

GDB te permite localizar exactamente dónde falla tu programa en solo 15–30 segundos. En lugar de añadir printf y recompilar constantemente, utiliza el depurador para inspeccionar la pila de llamadas y los valores de las variables en tiempo real. Compila con -g -O0 para incluir información de depuración:

g++ -g -O0 -o myprogram myprogram.cpp

Verifica que la información de depuración esté presente usando file myprogram. Inicia la depuración con gdb ./myprogram, luego ejecuta run. Al producirse un fallo de segmentación, GDB se detiene y muestra la ubicación exacta mediante backtrace (bt).

Un fallo en std::string::operator= con un puntero this nulo aparece de inmediato en el rastro de pila:

Google AdInline article slot
#0 0x... in std::string::operator= (this=0x0, ...)
#1 0x... in UserData::setName (...)
#2 0x... in main ()

Activa una salida más legible: set print pretty on y set print demangle on.

Puntos de interrupción y avance por código

Establece puntos de interrupción para controlar la ejecución:

  • break main — al inicio de main
  • break program.cpp:42 — en una línea específica
  • break UserData::setName — al entrar en un método
  • info break — lista todos los puntos de interrupción

Para funciones sobrecargadas en C++, especifica la firma: break print(int) o break print(std::string). Opción avanzada: rbreak ^.*::print$ para coincidir con todos los métodos print usando expresiones regulares.

Google AdInline article slot

Navega por el código:

| Comando | Atajo | Acción |

|---------|-------|--------|

Google AdInline article slot

| next | n | Ejecuta la línea sin entrar en funciones |

| step | s | Ejecuta la línea y entra en funciones |

| finish | fin | Ejecuta hasta que finalice la función |

| continue | c | Continúa hasta el siguiente punto de interrupción |

En C++, evita usar step dentro de llamadas de STL como push_back — usa next para mantenerte fuera del código interno de la biblioteca.

Inspección de variables y objetos

Utiliza estos comandos para examinar datos:

  • print variable_name — ver el valor de la variable
  • print *pointer — desreferenciar puntero
  • print vec.size() — llamar a un método
  • display variable_name — mostrar automáticamente tras cada paso
  • info locals — mostrar variables locales
  • info args — mostrar argumentos de la función

GDB representa correctamente los tipos de C++:

print myVector
$1 = std::vector of length 5, capacity 8 = {1, 2, 3, 4, 5}

print myString
$2 = "Hello, World!"

Si ves <optimized out>, vuelve a compilar con -O0. Sin -g, no aparecerán los nombres de las variables.

Modo TUI para depuración visual

Activa tui enable: la pantalla se divide en dos partes. La parte superior muestra el código fuente con la línea actual resaltada; la inferior, los comandos. Usa:

  • layout src — vista de código fuente
  • layout asm — vista de ensamblado
  • layout split — código + ensamblado
  • layout regs — ventana de registros
  • Ctrl + X, 2 — dos ventanas
  • Ctrl + X, o — cambiar entre ventanas
  • Ctrl + X, a — salir del modo TUI

El modo TUI simplifica la navegación mostrando contexto sin depender de números de línea.

Problemas comunes y soluciones

| Problema | Solución |

|--------|----------|

| <optimized out> | Vuelve a compilar con -O0 |

| Sin nombres de variables | Usa la bandera -g |

| Variables locales faltantes | Ejecuta info locals dentro de la función |

| Vector muestra basura | Usa print vec._M_impl._M_start en versiones antiguas de libstdc++ |

Comandos esenciales para desarrolladores intermedios

Domina estos 10 comandos para resolver el 90% de los problemas de depuración:

  • r — ejecutar
  • b — establecer punto de interrupción
  • bt — traza de pila
  • n — siguiente
  • s — paso
  • fin — finalizar
  • c — continuar
  • p — imprimir
  • i locals — variables locales
  • q — salir

Conclusiones clave

  • La pila de llamadas (bt) resuelve el 70% de los fallos de segmentación en segundos, revelando todo el camino de regreso a main.
  • El modo TUI visualiza el código, reduciendo la carga cognitiva en proyectos complejos.
  • -g -O0 son obligatorios; sin ellos, la depuración es inútil.
  • next frente a step es crucial en C++ con STL — evita profundizarte en el código de la biblioteca.
  • display y info locals/args ofrecen visibilidad total sobre el estado sin llenar el código con prints.

— Editorial Team

Advertisement 728x90

Leer después