π Failure Diagnosis - Flowchart de DecisiΓ³n
π― ClasificaciΓ³n RΓ‘pida
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β [Test fallΓ³] β ΒΏFalla consistentemente? β
β β β β
β SΓ NO β
β β β β
β π Bug real β‘ Flaky test β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Prueba de consistencia: β
β Run 10 veces β Si falla todas = Bug real β
β β Si falla algunas = Flaky β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π Bug Real: Patrones Comunes
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β CATEGORΓAS DE BUGS REALES β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β π΄ ASSERTION FAILURE β
β β
β SΓntoma: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β FAILED: β β
β β REQUIRE( actual == expected ) β β
β β with expansion: β β
β β 440.123 == 440.0 β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Investigar: β
β β ΒΏCambiΓ³ el algoritmo recientemente? β
β β ΒΏEs regresiΓ³n de un commit especΓfico? β
β β ΒΏTolerancia demasiado estricta? β
β β ΒΏTest expectation desactualizada? β
β β
β AcciΓ³n: β
β 1. git bisect para encontrar commit culpable β
β 2. Review cambios en ese commit β
β 3. Verificar si bug o test incorrecto β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β π₯ CRASH / SEGFAULT β
β β
β SΓntoma: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Segmentation fault (core dumped) β β
β β Signal: SIGSEGV β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Causas comunes: β
β β Null pointer dereference β
β β Out of bounds array access β
β β Use after free β
β β Stack overflow (infinite recursion) β
β β
β DiagnΓ³stico: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β # GDB debugger β β
β β gdb ./test_executable core β β
β β (gdb) bt # Backtrace β β
β β (gdb) frame 0 # Inspect crash frame β β
β β (gdb) print var # Inspect variables β β
β β β β
β β # AddressSanitizer β β
β β cmake -DASAN=ON .. β β
β β ./test_executable # Will pinpoint exact line β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β β±οΈ TIMEOUT β
β β
β SΓntoma: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Test timed out after 30 seconds β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Causas comunes: β
β β Infinite loop β
β β Deadlock (thread waiting forever) β
β β Performance regression (cΓ³digo muy lento) β
β β Blocking I/O sin timeout β
β β
β DiagnΓ³stico: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β # Attach debugger mientras corre β β
β β gdb -p <pid> β β
β β (gdb) thread apply all bt # Backtrace de todos threads β β
β β β β
β β # Profile para encontrar hotspot β β
β β perf record ./test_executable β β
β β perf report β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β πΎ MEMORY LEAK β
β β
β SΓntoma: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β ==12345== LEAK SUMMARY: β β
β β ==12345== definitely lost: 1,024 bytes in 1 blocks β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Causas comunes: β
β β new sin delete β
β β malloc sin free β
β β Smart pointer circular reference β
β β Resource leak (file handles, sockets) β
β β
β DiagnΓ³stico: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β # Valgrind (Linux/macOS) β β
β β valgrind --leak-check=full ./test_executable β β
β β β β
β β # AddressSanitizer con leak detection β β
β β ASAN_OPTIONS=detect_leaks=1 ./test_executable β β
β β β β
β β # Windows: Visual Studio memory profiler β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β‘ Flaky Test: Causas
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β CATEGORΓAS DE FLAKINESS β
β β
β π² Race conditions β Threading bug β
β β° Timing dependencies β Sleep/wait unreliable β
β π External dependencies β Network, filesystem β
β π° Random data β Seed not fixed β
β π» Platform-specific β OS/compiler differences β
β π Floating point β Rounding differences β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β π² RACE CONDITIONS β
β β
β Ejemplo problemΓ‘tico: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β // Thread 1 β β
β β data = new AudioBuffer(); β β
β β β β
β β // Thread 2 β β
β β process(data); // β οΈ Puede ejecutar antes de new β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β SΓntoma: β
β β Falla ~20% de las veces β
β β Falla mΓ‘s en mΓ‘quinas rΓ‘pidas/multicore β
β β Falla difiere entre runs β
β β
β SoluciΓ³n: β
β β NO testear multithreading directamente en unit tests β
β β Usar mocks para simular threading β
β β Dedicated integration tests con sincronizaciΓ³n explΓcita β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β β° TIMING DEPENDENCIES β
β β
β Ejemplo problemΓ‘tico: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β startAsyncOperation(); β β
β β sleep(100); // "Should be enough" β β
β β REQUIRE(operation.isComplete()); // β οΈ No garantizado β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β SΓntoma: β
β β Falla en mΓ‘quinas lentas (CI servers) β
β β Falla bajo carga β
β β Timing assumptions invΓ‘lidos β
β β
β SoluciΓ³n: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β // β
Wait explΓcito con condition β β
β β bool waitUntil(condition, timeout) { β β
β β auto start = now(); β β
β β while (!condition() && now() - start < timeout) { β β
β β sleep(10ms); β β
β β } β β
β β return condition(); β β
β β } β β
β β β β
β β REQUIRE(waitUntil([&]{ return op.isComplete(); }, 5s)); β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β π EXTERNAL DEPENDENCIES β
β β
β Dependencias problemΓ‘ticas: β
β β Network availability β
β β Specific file existing in filesystem β
β β System time/date β
β β Environment variables β
β β Hardware (audio device, GPU) β
β β
β SΓntoma: β
β β Pasa localmente, falla en CI β
β β Falla en diferentes plataformas β
β β Falla cuando ejecutas desde diferente directorio β
β β
β SoluciΓ³n: β
β β Mock filesystem (usar test fixtures) β
β β Mock network (no hacer real HTTP calls) β
β β Inject time source (no usar system clock directamente) β
β β Inject dependencies (dependency injection pattern) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β π° RANDOM DATA β
β β
β Ejemplo problemΓ‘tico: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β float testValue = random(); // β οΈ Different cada run β β
β β auto result = process(testValue); β β
β β REQUIRE(result > 0); // Puede fallar con ciertos valores β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β SΓntoma: β
β β Resultados no reproducibles β
β β Falla esporΓ‘dicamente sin patrΓ³n β
β β DifΓcil de debuggear (no puedes reproducir) β
β β
β SoluciΓ³n: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β // β
Fix random seed β β
β β srand(42); // Same sequence every run β β
β β β β
β β // O mejor: usar valores determinΓsticos β β
β β float testValue = 0.5f; // Explicit, reproducible β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π§ Quick Fixes Reference
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β Problema β SoluciΓ³n RΓ‘pida β
β βββββββββββββββββββββββββͺβββββββββββββββββββββββββββββββββ β
β Timing issue β Remove sleeps, use mocks β
β Race condition β Synchronization primitives β
β Random failures β Fix seed: srand(42) β
β Platform variance β Adjust tolerances β
β Filesystem dependency β Mock filesystem β
β Float comparison β Use REQUIRE_THAT(x, Approx(y)) β
β Network dependency β Mock HTTP client β
β System time dependency β Inject clock, use fake time β
β Memory leak β Smart pointers, RAII β
β Null pointer β Add null checks, use optional<> β
β β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π― Workflow de Debug
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β FLOWCHART DE DEBUG β
β β
β 1οΈβ£ Reproduce localmente β
β β Run test en tu mΓ‘quina β
β β Si no reproduce: es flaky o environment-specific β
β β
β 2οΈβ£ Run en aislamiento β
β β ./test_specific_case (no suite completo) β
β β Elimina interferencia de otros tests β
β β
β 3οΈβ£ Increase verbosity/logging β
β β CATCH_CONFIG_RUNNER con custom reporter β
β β Agregar debug prints en cΓ³digo bajo test β
β β
β 4οΈβ£ Debugger breakpoint β
β β Set breakpoint en lΓnea de falla β
β β Inspect variables, stack, memory β
β β
β 5οΈβ£ Inspect state β
β β ΒΏQuΓ© valores tienen las variables? β
β β ΒΏEstado de objetos correcto? β
β β ΒΏPunteros vΓ‘lidos? β
β β
β 6οΈβ£ Fix β Verify β Document β
β β Apply fix β
β β Run test 100 veces para confirmar β
β β Document el bug y fix en commit message β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π‘ Prevention: Evitar Failures Futuros
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β π‘οΈ DEFENSIVE TESTING PRACTICES β
β β
β β
Siempre fix random seeds β
β β
Mock external dependencies β
β β
Use waitUntil() no sleep() β
β β
Floating point: use Approx() con tolerance β
β β
Null checks antes de dereference β
β β
RAII para resource management β
β β
Run tests con sanitizers (ASAN, TSAN, UBSAN) β
β β
Run tests en paralelo para detectar races β
β β
CI debe run cada test mΓΊltiples veces β
β β
Document assumptions en comments β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β Tool β QuΓ© detecta β
β βββββββββββββββββββββββββͺβββββββββββββββββββββββββββββββββ β
β GDB/LLDB β Crashes, inspecciΓ³n de estado β
β Valgrind β Memory leaks, invalid access β
β AddressSanitizer β Memory errors, leaks β
β ThreadSanitizer β Race conditions, data races β
β UndefinedBehaviorSan β Undefined behavior (overflow, etc) β
β perf/VTune β Performance bottlenecks β
β strace/ltrace β System calls, library calls β
β Catch2 reporters β Custom test output formatting β
β β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π Checklist: Before Filing Bug
β‘ Reproducido localmente (no solo en CI)
β‘ Reproducido en aislamiento (single test)
β‘ Verificado que no es flaky (run 10+ veces)
β‘ Stack trace capturado (si crash)
β‘ Minimal reproducible example creado
β‘ git bisect ejecutado para encontrar culprit commit
β‘ Logs y output relevante guardados
β‘ Environment details documentados (OS, compiler, etc)