307 lines
7.9 KiB
Markdown
307 lines
7.9 KiB
Markdown
# Common Bug Patterns and Signatures
|
|
|
|
This reference documents frequently encountered bug patterns, their signatures, and diagnostic approaches.
|
|
|
|
## Pattern Categories
|
|
|
|
### 1. Timing and Concurrency Issues
|
|
|
|
#### Race Conditions
|
|
**Signature:**
|
|
- Intermittent failures
|
|
- Works in development but fails in production
|
|
- Different results with same input
|
|
- Failures during high load
|
|
|
|
**Common Causes:**
|
|
- Shared mutable state without synchronization
|
|
- Incorrect thread-safety assumptions
|
|
- Async operations completing in unexpected order
|
|
|
|
**Investigation Approach:**
|
|
- Add extensive logging with timestamps
|
|
- Use debugger breakpoints sparingly (changes timing)
|
|
- Add delays to expose race windows
|
|
- Review all shared state access patterns
|
|
|
|
#### Deadlocks
|
|
**Signature:**
|
|
- Application hangs indefinitely
|
|
- No error messages
|
|
- High CPU or complete freeze
|
|
- Multiple threads waiting
|
|
|
|
**Common Causes:**
|
|
- Circular wait for locks
|
|
- Lock ordering violations
|
|
- Database transaction deadlocks
|
|
|
|
**Investigation Approach:**
|
|
- Check thread dumps / stack traces
|
|
- Review lock acquisition order
|
|
- Use database deadlock detection tools
|
|
- Add timeout mechanisms
|
|
|
|
### 2. Memory Issues
|
|
|
|
#### Memory Leaks
|
|
**Signature:**
|
|
- Gradually increasing memory usage
|
|
- Performance degradation over time
|
|
- Out of memory errors after extended runtime
|
|
- Works initially, fails after hours/days
|
|
|
|
**Common Causes:**
|
|
- Event listeners not cleaned up
|
|
- Cache without eviction policy
|
|
- Circular references preventing garbage collection
|
|
- Resource handles not closed
|
|
|
|
**Investigation Approach:**
|
|
- Profile memory over time
|
|
- Take heap dumps at intervals
|
|
- Compare object counts between snapshots
|
|
- Check for unclosed resources (files, connections, sockets)
|
|
|
|
#### Stack Overflow
|
|
**Signature:**
|
|
- Stack overflow error
|
|
- Deep recursion errors
|
|
- Crashes at predictable depth
|
|
|
|
**Common Causes:**
|
|
- Unbounded recursion
|
|
- Missing base case in recursive function
|
|
- Circular data structure traversal
|
|
|
|
**Investigation Approach:**
|
|
- Check recursion depth
|
|
- Verify base case conditions
|
|
- Look for circular references
|
|
- Consider iterative alternative
|
|
|
|
### 3. State Management Issues
|
|
|
|
#### Stale Cache
|
|
**Signature:**
|
|
- Outdated data displayed
|
|
- Inconsistency between systems
|
|
- Works after cache clear
|
|
- Different results on different servers
|
|
|
|
**Common Causes:**
|
|
- Cache invalidation not triggered
|
|
- TTL too long
|
|
- Distributed cache synchronization issues
|
|
|
|
**Investigation Approach:**
|
|
- Check cache invalidation logic
|
|
- Verify cache key generation
|
|
- Test with cache disabled
|
|
- Review cache update patterns
|
|
|
|
#### State Corruption
|
|
**Signature:**
|
|
- Invalid state transitions
|
|
- Data inconsistency
|
|
- Unexpected null values
|
|
- Objects in impossible states
|
|
|
|
**Common Causes:**
|
|
- Direct state mutation
|
|
- Missing validation
|
|
- Incorrect error handling leaving partial updates
|
|
- Concurrent modifications
|
|
|
|
**Investigation Approach:**
|
|
- Add state validation assertions
|
|
- Review state mutation points
|
|
- Check transaction boundaries
|
|
- Look for error handling gaps
|
|
|
|
### 4. Integration Issues
|
|
|
|
#### API Failures
|
|
**Signature:**
|
|
- Timeout errors
|
|
- 500/503 errors
|
|
- Network errors
|
|
- Rate limiting responses
|
|
|
|
**Common Causes:**
|
|
- Third-party API downtime
|
|
- Network connectivity issues
|
|
- Authentication token expiration
|
|
- Rate limits exceeded
|
|
|
|
**Investigation Approach:**
|
|
- Check API status pages
|
|
- Verify network connectivity
|
|
- Review authentication flow
|
|
- Check rate limit headers
|
|
- Test with API directly (curl/Postman)
|
|
|
|
#### Database Issues
|
|
**Signature:**
|
|
- Connection pool exhausted
|
|
- Slow query performance
|
|
- Lock wait timeouts
|
|
- Connection refused errors
|
|
|
|
**Common Causes:**
|
|
- Connection leaks (not closing connections)
|
|
- Missing indexes causing full table scans
|
|
- N+1 query problems
|
|
- Database server overload
|
|
|
|
**Investigation Approach:**
|
|
- Monitor connection pool metrics
|
|
- Review slow query logs
|
|
- Check execution plans
|
|
- Look for repeated queries in loops
|
|
|
|
### 5. Configuration Issues
|
|
|
|
#### Environment Mismatches
|
|
**Signature:**
|
|
- Works locally, fails in production
|
|
- Different behavior across environments
|
|
- "It works on my machine"
|
|
|
|
**Common Causes:**
|
|
- Different environment variables
|
|
- Different dependency versions
|
|
- Different configuration files
|
|
- Platform-specific code paths
|
|
|
|
**Investigation Approach:**
|
|
- Compare environment variables
|
|
- Check dependency versions (package-lock.json, poetry.lock, etc.)
|
|
- Review configuration for environment-specific values
|
|
- Check platform-specific code paths
|
|
|
|
#### Missing Dependencies
|
|
**Signature:**
|
|
- Module not found errors
|
|
- Import errors
|
|
- Class/function not defined
|
|
- Version incompatibility errors
|
|
|
|
**Common Causes:**
|
|
- Missing package in requirements
|
|
- Outdated dependency versions
|
|
- Peer dependency conflicts
|
|
- System library missing
|
|
|
|
**Investigation Approach:**
|
|
- Review dependency manifests
|
|
- Check installed versions vs required
|
|
- Look for dependency conflicts
|
|
- Verify system libraries installed
|
|
|
|
### 6. Logic Errors
|
|
|
|
#### Off-by-One Errors
|
|
**Signature:**
|
|
- Index out of bounds
|
|
- Missing first or last element
|
|
- Infinite loops
|
|
- Incorrect boundary handling
|
|
|
|
**Common Causes:**
|
|
- Using < instead of <=
|
|
- 0-indexed vs 1-indexed confusion
|
|
- Incorrect loop conditions
|
|
|
|
**Investigation Approach:**
|
|
- Check boundary conditions
|
|
- Test with edge cases (empty, single element)
|
|
- Review loop conditions carefully
|
|
- Add assertions for expected ranges
|
|
|
|
#### Type Coercion Bugs
|
|
**Signature:**
|
|
- Unexpected type errors
|
|
- Comparison behaving unexpectedly
|
|
- String concatenation instead of addition
|
|
- Falsy value handling issues
|
|
|
|
**Common Causes:**
|
|
- Implicit type conversion
|
|
- Loose equality checks (== vs ===)
|
|
- Type assumptions without validation
|
|
- Mixed numeric types
|
|
|
|
**Investigation Approach:**
|
|
- Add explicit type checks
|
|
- Use strict equality
|
|
- Add type annotations/hints
|
|
- Check for implicit conversions
|
|
|
|
### 7. Error Handling Issues
|
|
|
|
#### Swallowed Exceptions
|
|
**Signature:**
|
|
- Silent failures
|
|
- No error messages despite failure
|
|
- Incomplete operations
|
|
- Success reported despite failure
|
|
|
|
**Common Causes:**
|
|
- Empty catch blocks
|
|
- Broad exception catching
|
|
- Returning default values on error
|
|
- Not re-raising exceptions
|
|
|
|
**Investigation Approach:**
|
|
- Search for empty catch/except blocks
|
|
- Review exception handling patterns
|
|
- Add logging to all error paths
|
|
- Check for bare except/catch clauses
|
|
|
|
#### Error Propagation Failures
|
|
**Signature:**
|
|
- Low-level errors exposed to users
|
|
- Unclear error messages
|
|
- Generic "Something went wrong"
|
|
- Stack traces in user interface
|
|
|
|
**Common Causes:**
|
|
- No error translation layer
|
|
- Missing error boundaries
|
|
- Not catching specific exceptions
|
|
- No user-friendly error messages
|
|
|
|
**Investigation Approach:**
|
|
- Review error handling architecture
|
|
- Check error message clarity
|
|
- Verify error boundaries exist
|
|
- Test error scenarios
|
|
|
|
## Pattern Recognition Strategies
|
|
|
|
### Look for These Red Flags:
|
|
|
|
1. **Time-based behavior**: If adding delays changes behavior, suspect timing issues
|
|
2. **Load-based failures**: If failures increase with load, suspect resource exhaustion or race conditions
|
|
3. **Environment-specific**: If only fails in certain environments, suspect configuration differences
|
|
4. **Gradual degradation**: If performance worsens over time, suspect memory leaks or resource leaks
|
|
5. **Intermittent failures**: If behavior is non-deterministic, suspect concurrency issues or external dependencies
|
|
|
|
### Diagnostic Quick Checks:
|
|
|
|
1. **Can you reproduce it consistently?** No → Likely timing/concurrency issue
|
|
2. **Does it fail immediately?** Yes → Likely configuration or initialization issue
|
|
3. **Does it fail after some time?** Yes → Likely resource leak or state corruption
|
|
4. **Does it fail with specific input?** Yes → Likely validation or edge case handling issue
|
|
5. **Does it fail only in production?** Yes → Likely environment or load-related issue
|
|
|
|
## Using This Reference
|
|
|
|
When encountering a bug:
|
|
1. Match the signature to patterns above
|
|
2. Review common causes for that pattern
|
|
3. Follow the investigation approach
|
|
4. Apply lessons from similar past issues
|
|
5. Update this document if you discover new patterns
|