codacrash: análisis de crash
codacrash lee el dump de un programa que se rompió y dice por qué: triage, causa raíz y explotabilidad, sin acceso a la red por defecto.
Para analizar, no necesitas WinDbg, DbgHelp ni otro depurador.
Frontera ética. codacrash es estrictamente defensivo: detecta, clasifica y ayuda a remediar. Nunca genera exploit, PoC ofensiva ni herramienta de ataque. La telemetría nunca deriva del contenido de un dump.
Instalar
Descarga el binario en Descargar: macOS, Linux x64, Windows x64 y x86. Usa el x86 para capturar una app de 32 bits, como Delphi 7. codacrash ya no corre en Windows 7, pero analiza dumps generados allí. Verifica la firma (Cadena de suministro). No hay paquete npm ni fórmula brew. El paquete Linux x64 trae también los tres módulos del codaguard (abajo).
Licencia. Analizar un artefacto es libre. Hacer triage o correlacionar dos o más artefactos requiere licencia Pro, Verified o Platform en el binario público (Vibe no incluye runtime). Ver planes.
Analizar un dump
codacrash analyze crash.dmp # autodetecta el formato
codacrash analyze core.1234 --format json # envelope coda-crash/1 (kind: analysis)
codacrash analyze app.hprof # heap Java → kind: heap
codacrash analyze hs_err_pid1234.log # fatal error log de la JVM → kind: hserr
codacrash analyze snapshot.heapsnapshot # heap V8 / Node
codacrash analyze core.1234 --rt-report valgrind.txt # + quién asignó y quién liberó (Valgrind/ASan)
Formatos: Minidump (Windows), core ELF (Linux), core Mach-O (macOS), HPROF, hs_err, heap V8, core CPython y reportes de Valgrind, ASan y OSS-Fuzz. Flags útiles: --all-threads, --module-path (carpetas con los binarios, para nombrar funciones internas), --managed (heap .NET vía dotnet-dump), --dsc (shared cache de macOS).
En un core Linux (glibc), codacrash señala double free, escritura después de free (nombrando el bloque afectado) y cabecera de bloque sobrescrita. Una instantánea de un proceso vivo en Linux (gcore, heapdump native) no se trata como crash: sale 0 con la memoria íntegra y 10 solo cuando el heap está corrupto.
El informe trae os, arch, fault, fault_address, fault_insn, crash_id (8 hex, la huella del crash), severity y exploitability en la escala de coda-finding/1 (critical|high|medium|low · high|medium|low|unknown), heap_corrupt y stack_smash. La etiqueta legible solo aparece en la salida de texto; el campo JSON siempre lleva el valor de la escala.
Triage y correlación
codacrash triage dumps/*.dmp # agrupa por CRASH_ID — cuántos crashes distintos hay
codacrash correlate core.* # denominador común entre varios cores de la misma app
codacrash correlate core.* --format json # coda-crash/1 con kind: correlation
En JSON, el triage sale como coda-crash/1 con kind: triage y la correlación con kind: correlation. Un archivo que no abre o es inválido entra en el lote como error, y los demás siguen.
Capturar
codacrash doctor # ¿esta máquina puede producir un dump analizable?
codacrash run app.exe -- --config prod.ini # corre el programa y captura el .dmp en el crash (solo Windows)
codacrash capture app.exe --out ./dumps # como run, pero solo captura (solo Windows)
codacrash heapdump native <pid> # instantánea de un proceso VIVO: gcore, lldb o MiniDumpWriteDump
codacrash heapdump java <pid> # heap Java (HPROF) · también: dotnet, python
doctor revisa core_pattern, ulimit -c, espacio en disco y ptrace_scope (Linux) y la herramienta de captura de cada sistema, y sale 1 cuando algo impide la captura.
Banco: deep-run
Lo que el dump no muestra (lectura no inicializada, la instrucción exacta del acceso inválido, quién escribió en una dirección) aparece al correr el programa bajo una herramienta de instrumentación que ya tengas instalada:
codacrash deep-run ./app -- --config prod.ini # detecta el motor: drmemory o memcheck (Valgrind)
CODAFORT_DBI=replay codacrash deep-run ./app # rr: graba, reejecuta y nombra quién escribió en el chunk
memcheck corre en Linux y macOS x86-64; drmemory en Linux, Windows y ARM; replay en Linux con PMU.
Exit codes
| Código | Significado |
|---|---|
0 | análisis terminado sin nada que actuar: sin crash, instantánea íntegra, heap dump sin antipatrón; en run, el objetivo terminó normal |
1 | doctor: hay un fallo en el entorno y la captura no va a funcionar aquí |
2 | uso incorrecto: argumento, token de licencia rechazado, activate en un build sin licenciamiento |
10 | hay algo que actuar: crash analizado, heap corrupto en una instantánea, antipatrón en un heap dump, error de memoria en deep-run |
11 | deadlock Java (hs_err) |
20 | dump inválido o corrupto, incluida la entrada que tumbaría al analizador |
30 | error de E/S: no abrió el archivo, no grabó la salida o la licencia |
40 | fallo de captura (o ningún motor de deep-run en el PATH) |
41 | capacidad de pago sin licencia (fallo de precondición, distinto de dump inválido) |
codaguard: detección en runtime que queda en el core
codaguard es opcional y lo cargas junto con el programa. Registra lo que el dump solo no tiene: quién asignó el bloque corrupto y la escritura fuera del límite del bloque, verificada en el free. Ese registro queda dentro del core. En Linux, cárgalo con LD_PRELOAD; en macOS, compílalo a mano y cárgalo con DYLD_INSERT_LIBRARIES. SG_DENY_MODULES excluye módulos ruidosos (JVM, CLR, V8, Qt…). Al saturar, cuenta lo que dejó de rastrear, y el informe indica el techo necesario.
LD_PRELOAD=/ruta/codaguard.so SG_DENY_MODULES=libjvm ./mi-app
codacrash analyze core.1234 # el analizador correlaciona el bloque del agente con el heap
El paquete Linux x64 trae codaguard.so y dos módulos hermanos, codaguard-audit.so (diario de llamadas por hilo, cargado con LD_AUDIT) y codaguard-chaos.so (perturba la planificación para que la condición de carrera aparezca), con la guía codaguard.md. Para i386 o macOS, la guía da la línea de compilación.
Profiling
codacrash mide dónde el programa gasta el tiempo y emite coda-profile/1. La recolección es solo en Linux; la ingesta funciona en cualquier sistema.
codacrash profile ./servidor # on-CPU
codacrash profile ./servidor --off-cpu # off-CPU: dónde ESPERA (mutex, E/S)
codacrash profile --pid 4242 --sample-secs 10 # se adjunta a un proceso vivo
codacrash analyze perf.data # ingiere perf.data, collapsed stacks o JFR
Lo que no hace
No parchea el binario. El analizador no inyecta nada en el proceso (el codaguard es opcional y quien lo carga eres tú). No usa la red: símbolos solo detrás de un flag explícito. codacrash muestra lo que ocurrió en el proceso; si el problema está en el código fuente, lo responde codafort.