English | 한국어 | 中文 | 日本語 | Español | Tiếng Việt | Português | Русский | Türkçe | Deutsch | Français | Italiano
Una herramienta de depuración GDB diseñada para Agentes de IA (Claude Code, etc.). Utiliza una arquitectura de "CLI cliente ligero + Servidor RPC Python integrado en GDB", permitiendo la depuración GDB con estado a través de Bash.
- Análisis de Core Dump: Carga volcados de memoria con símbolos residentes para respuesta en milisegundos
- Depuración Live Attach: Adjuntar a procesos en ejecución con soporte para modo non-stop
- Salida JSON Estructurada: Todos los comandos producen JSON con truncamiento/paginación automática y sugerencias de operación
- Mecanismos de Seguridad: Lista blanca de comandos, limpieza automática por timeout de heartbeat, garantías de idempotencia
- Optimizado para Bases de Datos: scheduler-locking, paginación de objetos grandes, truncamiento multi-hilo
- Python: 3.6.8+
- GDB: 9.0+ con soporte Python habilitado
- SO: Linux
# Verificar si GDB tiene soporte Python
gdb -nx -q -batch -ex "python print('OK')"
# Si el GDB del sistema carece de Python, verificar GCC Toolset (RHEL/CentOS)
/opt/rh/gcc-toolset-13/root/usr/bin/gdb -nx -q -batch -ex "python print('OK')"# Instalar desde PyPI
pip install gdb-cli
# O instalar desde GitHub
pip install git+https://github.com/Cerdore/gdb-cli.git
# O clonar e instalar localmente
git clone https://github.com/Cerdore/gdb-cli.git
cd gdb-cli
pip install -e .gdb-cli env-check
## Inicio Rápido
### 1. Cargar Core Dump
```bash
gdb-cli load --binary ./my_program --core ./core.12345Salida:
{
"session_id": "f465d650",
"mode": "core",
"binary": "./my_program",
"core": "./core.12345",
"gdb_pid": 12345,
"status": "loading"
}Al cargar un binario grande o archivo core, consulta hasta que la sesión esté lista:
gdb-cli status -s f465d650{
"session_id": "f465d650",
"state": "ready",
"mode": "core",
"binary": "./my_program"
}Si el GDB predeterminado del sistema no tiene soporte Python, especifícalo con
--gdb-path:gdb-cli load --binary ./my_program --core ./core.12345 \ --gdb-path /opt/rh/gcc-toolset-13/root/usr/bin/gdb
Todas las operaciones usan --session / -s para especificar el ID de sesión:
SESSION="f465d650"
# Listar hilos
gdb-cli threads -s $SESSION
# Obtener backtrace (predeterminado: hilo actual)
gdb-cli bt -s $SESSION
# Obtener backtrace de un hilo específico
gdb-cli bt -s $SESSION --thread 3
# Evaluar expresiones C/C++
gdb-cli eval-cmd -s $SESSION "my_struct->field"
# Acceder a elementos de array
gdb-cli eval-element -s $SESSION "my_array" --index 5
# Ver variables locales
gdb-cli locals-cmd -s $SESSION
# Ejecutar comandos GDB sin procesar
gdb-cli exec -s $SESSION "info registers"
# Verificar estado de sesión
gdb-cli status -s $SESSION# Listar todas las sesiones activas
gdb-cli sessions
# Detener una sesión
gdb-cli stop -s $SESSION# Adjuntar a un proceso en ejecución (predeterminado: scheduler-locking + non-stop)
gdb-cli attach --pid 9876
# Adjuntar con archivo de símbolos
gdb-cli attach --pid 9876 --binary ./my_program
# Permitir modificación de memoria y llamadas a funciones
gdb-cli attach --pid 9876 --allow-write --allow-callgdb-cli load --binary <path> --core <path> [options]
--binary, -b Ruta del archivo ejecutable (requerido)
--core, -c Ruta del archivo core dump (requerido)
--sysroot Ruta sysroot (para depuración entre máquinas)
--solib-prefix Prefijo de bibliotecas compartidas
--source-dir Directorio de código fuente
--timeout Timeout de heartbeat en segundos (predeterminado: 600)
--gdb-path Ruta ejecutable de GDB (predeterminado: "gdb")load retorna inmediatamente con "status": "loading" después de que el servidor RPC sea alcanzable. Usa gdb-cli status -s <session> y espera "state": "ready" antes de comandos de inspección pesados.
gdb-cli attach --pid <pid> [options]
--pid, -p PID del proceso (requerido)
--binary Ruta del archivo ejecutable (opcional)
--scheduler-locking Habilitar scheduler-locking (predeterminado: true)
--non-stop Habilitar modo non-stop (predeterminado: true)
--timeout Timeout de heartbeat en segundos (predeterminado: 600)
--allow-write Permitir modificación de memoria
--allow-call Permitir llamadas a funcionesgdb-cli threads -s <session> [options]
--range Rango de hilos, ej., "3-10"
--limit Cantidad máxima de retorno (predeterminado: 20)
--filter-state Filtrar por estado ("running" / "stopped")gdb-cli bt -s <session> [options]
--thread, -t Especificar ID de hilo
--limit Cantidad máxima de frames (predeterminado: 30)
--full Incluir variables locales
--range Rango de frames, ej., "5-15"gdb-cli eval-cmd -s <session> <expr> [options]
--max-depth Límite de profundidad de recursión (predeterminado: 3)
--max-elements Límite de elementos de array (predeterminado: 50)gdb-cli eval-element -s <session> <expr> --index <N>gdb-cli exec -s <session> <command>
--safety-level Nivel de seguridad (readonly / readwrite / full)gdb-cli thread-apply -s <session> <command> --all
gdb-cli thread-apply -s <session> <command> --threads "1,3,5"{
"threads": [
{"id": 1, "global_id": 1, "state": "stopped"},
{"id": 2, "global_id": 2, "state": "stopped"}
],
"total_count": 5,
"truncated": true,
"current_thread": {"id": 1, "global_id": 1, "state": "stopped"},
"hint": "use 'threads --range START-END' for specific threads"
}{
"expression": "(int)5+3",
"value": 8,
"type": "int",
"size": 4
}{
"frames": [
{"number": 0, "function": "crash_thread", "address": "0x400a1c", "file": "test.c", "line": 42},
{"number": 1, "function": "start_thread", "address": "0x7f3fa2e13fa"}
],
"total_count": 2,
"truncated": false
}| Nivel de Seguridad | Comandos Permitidos |
|---|---|
readonly (predeterminado) |
bt, info, print, threads, locals, frame |
readwrite |
+ set variable |
full |
+ call, continue, step, next |
quit, kill, shell, signal siempre están bloqueados.
Se desconecta y termina automáticamente después de 10 minutos de inactividad por defecto. Configurable mediante --timeout.
Solo se permite una sesión por PID / archivo core. Cargas/attachments repetidos retornan el session_id existente.
Al analizar core dumps de otras máquinas, las rutas de bibliotecas compartidas pueden diferir:
# Establecer sysroot (reemplazo de prefijo de ruta)
gdb-cli load --binary ./my_program --core ./core.1234 \
--sysroot /path/to/target/rootfs
# Establecer directorio de código fuente (para depuración a nivel de fuente)
gdb-cli load --binary ./my_program --core ./core.1234 \
--source-dir /path/to/sourcesrc/gdb_cli/
├── cli.py # Punto de entrada CLI (Click)
├── client.py # Cliente Unix Socket
├── launcher.py # Lanzador de proceso GDB
├── session.py # Gestión de metadatos de sesión
├── safety.py # Filtro de lista blanca de comandos
├── formatters.py # Formateo de salida JSON
├── env_check.py # Verificación de entorno
├── errors.py # Clasificación de errores
└── gdb_server/
├── gdb_rpc_server.py # Núcleo del Servidor RPC
├── handlers.py # Manejadores de comandos
├── value_formatter.py # Serialización gdb.Value
└── heartbeat.py # Gestión de timeout de heartbeat
skills/
└── gdb-cli/ # Skill de Claude Code para depuración inteligente
├── SKILL.md # Definición del skill
└── evals/ # Casos de prueba para evaluación del skillpip install -e ".[dev]"
pytest tests/ -vRequiere GDB con soporte Python. Usa el programa de prueba de crash en tests/crash_test/:
# Compilar programa de prueba
cd tests/crash_test
gcc -g -pthread -o crash_test crash_test_c.c
# Generar coredump
ulimit -c unlimited
./crash_test # Producirá SIGSEGV
# Encontrar archivo core
ls /path/to/core_dumps/core-crash_test-*
# Ejecutar prueba E2E
gdb-cli load --binary ./crash_test --core /path/to/core \
--gdb-path /opt/rh/gcc-toolset-13/root/usr/bin/gdb- Sin soporte para
target remote(usa SSH para depuración remota, ver abajo) - Sin soporte para depuración multi-inferior
- Los pretty printers Guile en GDB 12.x no son thread-safe, solución mediante
format_string(raw=True) - La versión de Python embebido en GDB puede ser más antigua (ej., 3.6.8), el código tiene manejo de compatibilidad
Instalar y ejecutar en máquina remota en un solo comando:
ssh user@remote-host "pip install git+https://github.com/Cerdore/gdb-cli.git && gdb-cli load --binary ./my_program --core ./core.12345"O instalar primero, luego depurar:
# Instalar en remoto
ssh user@remote-host "pip install git+https://github.com/Cerdore/gdb-cli.git"
# Ejecutar depuración
ssh user@remote-host "gdb-cli load --binary ./my_program --core ./core.12345"Este proyecto incluye un skill gdb-cli para Claude Code que proporciona asistencia de depuración inteligente combinando análisis de código fuente con inspección de estado en tiempo de ejecución.
bunx skills add https://github.com/Cerdore/gdb-cli --skill=gdb-cli/gdb-cli
# O describe tu necesidad de depuración:
Tengo un core dump en ./core.1234 y el binario en ./myapp. Ayúdame a depurarlo.- Correlación de Código Fuente: Lee automáticamente archivos fuente alrededor de los puntos de crash
- Detección de Deadlock: Identifica patrones de espera circular en programas multi-hilo
- Advertencias de Seguridad: Alerta sobre riesgos en entornos de producción al adjuntar a procesos en vivo
- Informes Estructurados: Genera análisis con hipótesis de causa raíz y próximos pasos
Consulta skills/README.md para más detalles.
Apache License 2.0