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:
#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 mainbreak program.cpp:42— en una línea específicabreak UserData::setName— al entrar en un métodoinfo 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.
Navega por el código:
| Comando | Atajo | Acción |
|---------|-------|--------|
| 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 variableprint *pointer— desreferenciar punteroprint vec.size()— llamar a un métododisplay variable_name— mostrar automáticamente tras cada pasoinfo locals— mostrar variables localesinfo 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 fuentelayout asm— vista de ensambladolayout split— código + ensambladolayout regs— ventana de registrosCtrl + X, 2— dos ventanasCtrl + X, o— cambiar entre ventanasCtrl + 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— ejecutarb— establecer punto de interrupciónbt— traza de pilan— siguientes— pasofin— finalizarc— continuarp— imprimiri locals— variables localesq— 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 amain. - El modo TUI visualiza el código, reduciendo la carga cognitiva en proyectos complejos.
-g -O0son obligatorios; sin ellos, la depuración es inútil.nextfrente astepes crucial en C++ con STL — evita profundizarte en el código de la biblioteca.displayyinfo locals/argsofrecen visibilidad total sobre el estado sin llenar el código con prints.
— Editorial Team
Aún no hay comentarios.