# Evidence Gathering Patterns Techniques for gathering diagnostic information without changing behavior. ## Instrumentation Add diagnostic logging at key points: ```typescript function processData(data: Data): Result { console.log('[DEBUG] processData input:', JSON.stringify(data)); const transformed = transform(data); console.log('[DEBUG] after transform:', JSON.stringify(transformed)); const validated = validate(transformed); console.log('[DEBUG] after validate:', JSON.stringify(validated)); const result = finalize(validated); console.log('[DEBUG] processData result:', JSON.stringify(result)); return result; } ``` Key points to instrument: - Function entry/exit with parameters and return values - Before/after each transformation - Error catch blocks - State mutations ## Binary Search Debugging Find commit that introduced bug: ```bash git bisect start git bisect bad # Current commit is bad git bisect good # Known good commit # Git checks out middle commit # Test if bug exists, then: git bisect bad # if bug exists git bisect good # if bug doesn't exist # Repeat until git identifies exact commit ``` ## Differential Analysis Compare versions side by side: ```bash # Working version git show :path/to/file.ts > file-working.ts # Broken version git show :path/to/file.ts > file-broken.ts # Detailed diff diff -u file-working.ts file-broken.ts ``` ## Timeline Analysis Correlate events for timing issues: ``` 12:00:01.123 - Request received 12:00:01.145 - Database query started 12:00:01.167 - Cache check started 12:00:01.169 - Cache hit returned <-- Returned before DB! 12:00:01.234 - Database query completed 12:00:01.235 - Error: stale data <-- Bug symptom ``` Pattern: Log timestamps at every step, look for unexpected ordering or delays. ## Print Debugging Checklist When adding debug output: - [ ] Log function entry with all parameters - [ ] Log variable values before conditionals - [ ] Log loop iteration values - [ ] Log before/after external calls - [ ] Log error details in catch blocks - [ ] Include timestamps for timing issues - [ ] Use consistent prefix (e.g., `[DEBUG]`) for easy removal ## State Snapshots Capture intermediate state for inspection: ```typescript // Save state at checkpoint const checkpoint = { timestamp: Date.now(), state: structuredClone(currentState), lastOperation: 'after validation', }; debugSnapshots.push(checkpoint); // Later: inspect what state looked like at each point ```