Docs
20.4-Debugging-Techniques
20.4 Debugging Techniques
Overview
Debugging is the systematic process of identifying, isolating, and fixing bugs in code. Mastering debugging techniques is essential for efficient software development and maintenance.
Learning Objectives
By the end of this section, you'll understand:
- β’Browser DevTools debugging features
- β’Node.js debugging techniques
- β’Debugging strategies and methodologies
- β’Using breakpoints effectively
- β’Memory and performance debugging
- β’Common debugging patterns
Debugging Workflow
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Debugging Workflow β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββ β
β β 1. REPRODUCE βββββ Can you consistently trigger the bug? β
β ββββββββ¬βββββββ β
β βΌ β
β βββββββββββββββ β
β β 2. ISOLATE βββββ Where exactly does it occur? β
β ββββββββ¬βββββββ β
β βΌ β
β βββββββββββββββ β
β β 3. IDENTIFY βββββ What is the root cause? β
β ββββββββ¬βββββββ β
β βΌ β
β βββββββββββββββ β
β β 4. FIX βββββ Implement the solution β
β ββββββββ¬βββββββ β
β βΌ β
β βββββββββββββββ β
β β 5. VERIFY βββββ Confirm bug is fixed β
β ββββββββ¬βββββββ β
β βΌ β
β βββββββββββββββ β
β β 6. PREVENT βββββ Add tests, improve code β
β βββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Console Methods
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Console API Reference β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Basic Logging β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β console.log() β General logging β β
β β console.info() β Informational β β
β β console.warn() β Warnings (yellow) β β
β β console.error() β Errors (red) β β
β β console.debug() β Debug info (verbose) β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Formatting β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β console.table() β Display data as table β β
β β console.dir() β Object inspection β β
β β console.group() β Start collapsed group β β
β β console.groupEnd()β End group β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Performance β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β console.time() β Start timer β β
β β console.timeEnd() β End timer & log β β
β β console.count() β Count executions β β
β β console.countReset() β Reset counter β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Stack & Assert β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β console.trace() β Show call stack β β
β β console.assert() β Log if false β β
β β console.clear() β Clear console β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Browser DevTools
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Chrome DevTools Panels β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββ¬βββββββββββ¬βββββββββββ¬βββββββββββ¬βββββββββββ β
β β Elements β Console β Sources β Network β Perform- β β
β β β β β β ance β β
β ββββββββββββ΄βββββββββββ΄βββββββββββ΄βββββββββββ΄βββββββββββ β
β β β β β β β
β β β β β β β
β βΌ βΌ βΌ βΌ βΌ β
β βββββββββββ βββββββββββ βββββββββββ βββββββββββ βββββββββββ β
β β Inspect β β Execute β β Debug β β Monitor β β Profile β β
β β DOM β β JS β β code β βrequests β β runtime β β
β βββββββββββ βββββββββββ βββββββββββ βββββββββββ βββββββββββ β
β β
β Key Shortcuts: β
β F12 / Cmd+Opt+I β Open DevTools β
β Cmd+Shift+C β Inspect element β
β Cmd+P β Open file β
β Cmd+Shift+P β Command palette β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Breakpoint Types
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Types of Breakpoints β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β 1. Line Breakpoints β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Click line number in Sources panel β β
β β Execution pauses at that line β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β 2. Conditional Breakpoints β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Right-click β "Add conditional breakpoint" β β
β β Pauses only when condition is true β β
β β Example: i === 5 || user.id === targetId β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β 3. Logpoints β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Right-click β "Add logpoint" β β
β β Logs message without pausing β β
β β Example: "User: {user.name}, Count: {count}" β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β 4. DOM Breakpoints β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Right-click element β "Break on..." β β
β β β’ Subtree modifications β β
β β β’ Attribute modifications β β
β β β’ Node removal β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β 5. Event Listener Breakpoints β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Sources β Event Listener Breakpoints β β
β β β’ Mouse: click, mouseover, etc. β β
β β β’ Keyboard: keydown, keyup, etc. β β
β β β’ XHR/Fetch β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β 6. Exception Breakpoints β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Pause on: β‘ Caught exceptions β β
β β β Uncaught exceptions β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Debugging Controls
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Execution Controls β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β βΆοΈ Resume βοΈ Step Over β¬ Step Into β β
β β (F8) (F10) (F11) β β
β β β β
β β β« Step Out βΈοΈ Pause π Restart β β
β β (Shift+F11) (F8) β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Resume (F8) β Continue until next breakpoint β
β Step Over (F10) β Execute line, skip function internals β
β Step Into (F11) β Enter function on current line β
β Step Out β Exit current function β
β β
β Scope Inspection: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β’ Local: Variables in current function β β
β β β’ Closure: Variables from parent scopes β β
β β β’ Global: Global object (window/global) β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Watch Expressions: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Add expressions to monitor during debugging β β
β β Example: user.isAdmin, items.length, total > 100 β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Node.js Debugging
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Node.js Debugging Options β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β 1. Built-in Debugger β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β node inspect script.js β β
β β β β
β β Commands: β β
β β β’ cont, c β Continue β β
β β β’ next, n β Step over β β
β β β’ step, s β Step into β β
β β β’ out, o β Step out β β
β β β’ repl β Enter REPL mode β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β 2. Chrome DevTools β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β node --inspect script.js β Start inspector β β
β β node --inspect-brk script.js β Break at start β β
β β β β
β β Open: chrome://inspect β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β 3. VS Code Debugger β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β launch.json: β β
β β { β β
β β "type": "node", β β
β β "request": "launch", β β
β β "name": "Debug", β β
β β "program": "${file}" β β
β β } β β
β β β β
β β Press F5 to start debugging β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Debugging Strategies
| Strategy | When to Use | Approach |
|---|---|---|
| Binary Search | Large codebase | Comment out half, narrow down |
| Rubber Duck | Logic errors | Explain code aloud step by step |
| Print Debugging | Quick checks | Add console.log at key points |
| Bisect | Regression bugs | Find the commit that broke it |
| Divide & Conquer | Complex flow | Isolate subsystems |
| Trace Backwards | From error | Start at error, work back |
Common Bug Types
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Common Bug Categories β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Logic Errors β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β’ Off-by-one errors (< vs <=) β β
β β β’ Wrong boolean logic (&&/|| confusion) β β
β β β’ Incorrect comparisons (== vs ===) β β
β β β’ Wrong variable used β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Async Errors β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β’ Missing await β β
β β β’ Race conditions β β
β β β’ Unhandled promise rejections β β
β β β’ Callback not called β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Reference Errors β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β’ null/undefined access β β
β β β’ Accessing before declaration β β
β β β’ Typos in property names β β
β β β’ Scope confusion β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Type Errors β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β’ String instead of number β β
β β β’ Array expected, got object β β
β β β’ Function called on wrong type β β
β β β’ Implicit type coercion β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Memory Debugging
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Memory Debugging β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Memory Tab (DevTools): β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β β Heap snapshot β Capture memory state β β
β β β Allocation timeline β Track allocations β β
β β β Allocation sampling β Sample-based profiling β β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Finding Memory Leaks: β
β 1. Take heap snapshot (baseline) β
β 2. Perform suspected leaking action β
β 3. Take another snapshot β
β 4. Compare snapshots β
β 5. Look for: detached DOM, growing arrays, event listeners β
β β
β Common Memory Leak Causes: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β’ Forgotten timers/intervals β β
β β β’ Detached DOM nodes with references β β
β β β’ Closures capturing variables β β
β β β’ Event listeners not removed β β
β β β’ Global variables accumulating β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Key Debugging Tips
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Debugging Best Practices β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β β Reproduce first - Make the bug happen consistently β
β β Isolate - Create minimal reproduction case β
β β Check assumptions - Verify what you think is true β
β β Read error messages - They often tell you what's wrong β
β β Use version control - Bisect to find breaking changes β
β β Take breaks - Fresh eyes find bugs faster β
β β Write tests - Prevent regressions β
β β Document findings - Help future debugging β
β β
β Debug Mindset: β
β β’ Be systematic, not random β
β β’ Question everything β
β β’ Trust the computer (it does what you tell it) β
β β’ The bug is in YOUR code β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Navigation
- β’Previous: 20.3 Mocking & Test Doubles
- β’Next: 20.5 Code Quality & Coverage