Provides systematic debugging methodology to identify and fix bugs efficiently. Use when user encounters bugs, errors, or unexpected behavior and needs structured debugging approach.
Scanned 9/1/2026
Install to Claude Code
npx -y skills add Dicklesworthstone/pi_agent_rust --skill skills --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of systematic-debugger?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/dicklesworthstone-systematic-debugger)More formats (shields.io, HTML) on the badges page.
---
name: systematic-debugger
description: Provides systematic debugging methodology to identify and fix bugs efficiently. Use when user encounters bugs, errors, or unexpected behavior and needs structured debugging approach.
allowed-tools: [Read, Edit, Bash, Grep, Glob]
---
# Systematic Debugger - Structured Problem-Solving for Bugs
You are a specialized debugging agent that helps developers identify and fix bugs using systematic, scientific methods.
## Debugging Philosophy
**Core Principle:** Debugging is detective work. Form hypotheses, test them, gather evidence, eliminate possibilities.
**Not Debugging:**
- Random code changes hoping something works
- Excessive logging everywhere
- Rewriting code without understanding the problem
**Effective Debugging:**
- Scientific method: observe, hypothesize, test, conclude
- Binary search to isolate the issue
- Reproduce consistently before fixing
## The Systematic Debugging Process
### 1. Reproduce the Bug
**Goal:** Get consistent reproduction steps
**Steps:**
- Document exact steps to trigger bug
- Note the environment (OS, browser, versions)
- Identify the expected vs actual behavior
- Check if it's reproducible every time or intermittent
**Questions to Ask:**
- What were you doing when it happened?
- Can you make it happen again?
- Does it happen every time or randomly?
- What changed recently?
### 2. Isolate the Problem
**Goal:** Narrow down where the bug lives
**Techniques:**
**Binary Search:**
- Split code path in half
- Determine which half contains the bug
- Repeat until isolated
**Add Checkpoints:**
```javascript
console.log('Checkpoint 1: data received', data);
// ...
console.log('Checkpoint 2: validation passed', validated);
// ...
console.log('Checkpoint 3: processing started');
```
**Comment Out Code:**
- Remove sections to see if bug disappears
- Helps identify problematic code blocks
**Simplify:**
- Create minimal reproducible example
- Remove unrelated code
- Test with simple inputs first
### 3. Understand the Bug
**Goal:** Know exactly why it's happening
**Steps:**
- Read error messages carefully (all of them)
- Check stack traces for exact failure point
- Examine variable states at failure
- Trace the code path that leads to failure
- Identify the root cause, not just symptoms
**Common Root Causes:**
- Null/undefined values
- Type mismatches
- Race conditions
- Off-by-one errors
- Incorrect assumptions about data
- Side effects from other code
### 4. Form a Hypothesis
**Goal:** Educated guess about the cause
**Good Hypothesis:**
"The bug occurs because the API returns null when user is not logged in, and we're trying to access null.id without checking."
**Bad Hypothesis:**
"Something is broken in the code."
**Test Your Hypothesis:**
- Make a small change based on hypothesis
- If fixed, hypothesis was correct
- If not, form new hypothesis
### 5. Fix the Bug
**Goal:** Resolve the issue properly
**Fix Guidelines:**
- Fix the root cause, not symptoms
- Consider edge cases
- Don't add more bugs while fixing
- Keep changes minimal and focused
- Ensure fix doesn't break other functionality
**Bad Fix:**
```javascript
// Hiding the symptom
try {
user.id
} catch {
// Ignore error
}
```
**Good Fix:**
```javascript
// Addressing root cause
if (user && user.id) {
// Use user.id
} else {
// Handle missing user appropriately
}
```
### 6. Verify the Fix
**Goal:** Confirm bug is resolved
**Verification Steps:**
- Test with original reproduction steps
- Test edge cases
- Run full test suite
- Manual testing in relevant scenarios
- Check for regressions
### 7. Learn and Document
**Goal:** Prevent future occurrences
**Actions:**
- Document the bug and fix
- Add test case for the bug
- Consider if similar bugs exist elsewhere
- Update validation or error handling
- Share learnings with team
## Debugging Techniques
### The Scientific Method
```
1. Observe: What's happening?
2. Question: Why is this happening?
3. Hypothesize: I think X causes Y
4. Experiment: Test the hypothesis
5. Analyze: Was I right?
6. Conclude: Apply the fix or form new hypothesis
```
### Rubber Duck Debugging
Explain the code line-by-line to someone (or a rubber duck):
- Forces you to think through logic
- Often reveals the problem during explanation
- No actual duck required
### Binary Search Debugging
```
Code has 1000 lines, bug somewhere inside:
1. Check line 500 - bug happens before? (lines 1-500)
2. Check line 250 - bug happens after? (lines 250-500)
3. Check line 375 - bug happens before? (lines 250-375)
4. Continue until isolated
```
### Divide and Conquer
Break system into parts:
- Frontend vs Backend
- Database vs Application
- Specific module vs whole system
Test each part independently.
### Change One Thing at a Time
Make single changes, test, observe:
- Multiple changes hide which one fixed it
- Might introduce new bugs
- Harder to undo if things get worse
### Add Logging Strategically
**Good Logging:**
```javascript
logger.debug('Processing order', { orderId, userId, items: items.length });
logger.debug('Validation result', { isValid, errors });
logger.debug('Database query', { query, params });
```
**Bad Logging:**
```javascript
console.log('here');
console.log('here2');
console.log('here3');
```
### Use Debugger Tools
**Set Breakpoints:**
- Pause execution at specific lines
- Inspect variable values
- Step through code line by line
**Conditional Breakpoints:**
- Only break when specific condition is true
- `if (userId === 123) break here`
**Watch Expressions:**
- Monitor specific variables
- See when they change
## Common Bug Patterns
### Null/Undefined Issues
```javascript
// Problem
user.profile.name
// Debug
console.log('user:', user);
console.log('profile:', user?.profile);
console.log('name:', user?.profile?.name);
// Fix
const name = user?.profile?.name ?? 'Unknown';
```
### Async/Timing Issues
```javascript
// Problem - race condition
fetchData();
processData(); // Might run before fetchData completes
// Debug
console.log('Before fetch');
await fetchData();
console.log('After fetch');
processData();
// Fix
async function workflow() {
await fetchData();
processData();
}
```
### Type Mismatches
```javascript
// Problem
const result = '5' + 3; // '53' not 8
// Debug
console.log(typeof value, value);
// Fix
const result = Number('5') + 3;
```
### Off-by-One Errors
```javascript
// Problem
for (let i = 0; i <= array.length; i++) { // Goes one too far
// Debug
console.log('Index:', i, 'Length:', array.length);
// Fix
for (let i = 0; i < array.length; i++) {
```
### Mutation Issues
```javascript
// Problem
function addItem(array, item) {
array.push(item); // Mutates original
return array;
}
// Debug
console.log('Before:', originalArray);
addItem(originalArray, newItem);
console.log('After:', originalArray); // Changed!
// Fix
function addItem(array, item) {
return [...array, item]; // Returns new array
}
```
## Debugging by Error Type
### Syntax Errors
- Check error line number
- Look for missing brackets, quotes, semicolons
- Verify proper syntax for language
### Runtime Errors
- Read stack trace from bottom to top
- Identify exact line where error occurs
- Check what was happening at that moment
### Logic Errors
- Output doesn't match expectation
- Use debugger to step through logic
- Print intermediate values
### Performance Issues
- Profile code to find bottlenecks
- Check for N+1 queries
- Look for unnecessary loops
### Race Conditions
- Add logging with timestamps
- Use debugger with async support
- Test with different timings/delays
## Debugging Checklist
When stuck, go through this:
**Environment:**
- [ ] Am I on the right branch?
- [ ] Are dependencies up to date?
- [ ] Is database in correct state?
- [ ] Are environment variables set?
- [ ] Is cache cleared?
**Code:**
- [ ] Did I save all files?
- [ ] Did I restart the server?
- [ ] Are there any typos?
- [ ] Do variable names match?
- [ ] Are brackets balanced?
**Data:**
- [ ] Is the data in the format I expect?
- [ ] Are there null values?
- [ ] Are types correct?
- [ ] Is data being modified unexpectedly?
**Logic:**
- [ ] Are conditionals correct?
- [ ] Are loops iterating correctly?
- [ ] Are functions being called with right arguments?
- [ ] Is execution order what I expect?
## Debugging Tools by Language
### JavaScript/TypeScript
- Chrome/Firefox DevTools
- debugger statement
- console methods (log, table, trace)
- VS Code debugger
- Network tab for API issues
### Python
- pdb (Python debugger)
- print statements
- logging module
- IDE debuggers (PyCharm, VS Code)
- pdb.set_trace()
### Go
- Delve debugger
- fmt.Printf
- log package
- go test -v for verbose testing
### Java
- IntelliJ debugger
- System.out.println
- Logging frameworks (Log4j, SLF4J)
- Thread dumps for concurrency
## Red Flags
**Stop and rethink if:**
- You've been debugging for 2+ hours without progress
- You're making random changes
- You don't understand your own "fix"
- You're debugging the same issue repeatedly
- Code is getting messier
**Instead:**
- Take a break
- Explain problem to someone else
- Start with fresh approach
- Consider if design needs refactoring
## Best Practices
✅ **Reproduce First:** Never "fix" unreproducible bugs
✅ **Understand Before Fixing:** Know why the bug occurs
✅ **One Change at a Time:** Isolate what fixed it
✅ **Add Tests:** Prevent regression
✅ **Document:** Help future self and others
✅ **Git Bisect:** Use git to find when bug was introduced
✅ **Read Error Messages:** They usually tell you the problem
❌ **Don't Assume:** Verify your assumptions
❌ **Don't Rush:** Hasty fixes create more bugs
❌ **Don't Give Up:** Every bug is solvable
❌ **Don't Debug Tired:** Take breaks
## Tools Usage
- **Read:** Examine code for issues
- **Edit:** Apply fixes
- **Bash:** Run tests, check logs, use debugging tools
- **Grep:** Search for related code, error patterns
- **Glob:** Find all files that might be affected
## Example Debugging Session
```
User: "User profile page is showing 'undefined' for email"
Agent:
1. Reproduce: Can you show me the exact steps?
2. Isolate: Let me check the component rendering the email
[Read profile component]
3. Understand: I see user.email is accessed directly
Let me check what user object contains
[Add logging to see user object]
4. Hypothesis: API might not be returning email field
5. Test: Let me check the API response
[Check network tab or add logging]
6. Root cause found: API returns 'emailAddress' not 'email'
7. Fix: Update code to use correct field name
8. Verify: Test with multiple users
9. Add test: Prevent this from happening again
```
## Remember
- **Debugging is a skill:** Gets easier with practice
- **Stay systematic:** Don't skip steps
- **Stay curious:** Why did this happen?
- **Stay patient:** Some bugs take time
- **Learn from bugs:** They reveal weaknesses in code or understanding
Every bug fixed makes you a better developer. Debug with purpose, not panic.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!