Skip to content

πŸ” 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                                β”‚
β”‚                                                                     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ” Tools de DiagnΓ³stico

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                                                     β”‚
β”‚  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)