--- name: debugging description: "Debugging: systematic root-cause methodology + language-specific tools (Python pdb/debugpy, Node.js inspect/CDP)." version: 1.0.0 author: Hermes Agent license: MIT platforms: [linux, macos, windows] metadata: hermes: tags: [debugging, troubleshooting, python, nodejs, pdb, debugpy, breakpoints, root-cause] related_skills: [test-driven-development] --- # Debugging — Methodology + Tools Complete debugging guidance: the systematic process for finding root causes, plus language-specific tool references for Python and Node.js. ## The Iron Law ``` NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST ``` Random fixes waste time and create new bugs. Quick patches mask underlying issues. ## The Four Phases 1. **Root Cause Investigation** — Read errors carefully, reproduce consistently, check recent changes, gather evidence at component boundaries, trace data flow upstream, verify hypothesis against ALL known facts 2. **Pattern Analysis** — Find working examples, compare against references, identify differences 3. **Hypothesis and Testing** — Form single hypothesis, test minimally (one variable at a time), verify before continuing 4. **Implementation** — Create failing test, implement single fix, verify, check for regressions ### Rule of Three If 3+ fix attempts fail, STOP and question the architecture. Don't attempt fix #4 without discussion. See `references/methodology.md` for the complete systematic debugging process with red flags, rationalizations table, and Hermes tool integration. ## Language-Specific Tools ### Python (pdb + debugpy) | Tool | When | |------|------| | `breakpoint()` + pdb | Local, interactive, simplest | | `python -m pdb script.py` | Launch existing script under pdb, no source edits | | `debugpy` | Remote/headless, attach to running process, DAP protocol | | `remote-pdb` | Terminal-agent-friendly remote debugging via netcat | **Quick recipe:** ```python def compute(x, y): breakpoint() # drops into pdb here return x + y ``` See `references/python-debugpy.md` for full pdb command reference, debugpy remote patterns, post-mortem debugging, pytest integration, and Hermes-specific process debugging. ### Node.js (inspect + CDP) | Tool | When | |------|------| | `node inspect script.js` | Built-in CLI REPL, zero install | | `node --inspect-brk` | Start with inspector, pause on first line | | `chrome-remote-interface` | Scriptable CDP automation | **Quick recipe:** ```bash node --inspect-brk script.js & node inspect -p $! # debug> sb('script.js', 42) # debug> cont # debug> repl # inspect locals ``` See `references/node-inspect.md` for full REPL commands, attaching to running processes, CDP driver scripts, heap snapshots, CPU profiles, and Hermes ui-tui debugging. ## When to Use Breakpoint Debugging vs Print Statements - `print()`/`logging.debug` solves it in under a minute → use prints - `pytest -vv --tb=long --showlocals` reveals the issue → use pytest output - Need to see intermediate state in a closure → use breakpoints - Long-running process misbehaves and can't be restarted → use remote attach - Need call-stack context at the crash site → use post-mortem ## Common Pitfalls - **pdb under pytest-xdist silently does nothing** — always use `-p no:xdist` - **`breakpoint()` in committed code** — add pre-commit grep as safety net - **Wrong line numbers in TS** — breakpoints hit emitted JS, not source TS - **`--inspect` vs `--inspect-brk`** — without `-brk`, script races past your breakpoint - **Port collisions** — use `--inspect=0` for random port, read from `/json/list`