关于 debug-systematic
debug-systematic 提供循证的系统化调试流程,面向需要定位和修复软件故障的开发者。流程分为复现、隔离、诊断、修复与验证,强调以证据查明根因。
主要功能
- 01四阶段调试流程
- 02记录复现步骤与环境
- 03二分法及 git bisect 定位
- 04以假设和证据诊断根因
- 05最小化修复与验证
- 06调试反模式清单
适用场景
- 01稳定复现间歇性故障
- 02缩小回归问题的代码范围
- 03用证据区分症状与根因
- 04验证修复并降低再次发生风险
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ travisjneuman/ .claude --skill debug-systematic安装后在 Claude Code 中输入/debug-systematic确认已加载。
详细介绍
系统化调试协议
一种严谨、以证据为依据的调试方法,可避免猜测并确保找到根本原因。
4 阶段协议
阶段 1:复现(确认事实)
目标:在进行任何调查之前,制定可靠的复现步骤。
操作:
- 记录触发 Bug 的确切步骤
- 记录环境详情(操作系统、版本、配置、内存、网络)
- 确定发生频率:总是发生?偶尔发生?在特定条件下发生?
- 捕获准确的错误消息、堆栈跟踪和屏幕截图
- 在不同环境中测试,以隔离变量
关键问题:
- 最近一次正常工作是什么时候?
- 此后发生了什么变化?(代码、依赖项、配置、基础设施)
- 是否只在特定环境中出现?
- 是否与特定数据有关?
- 是否与时序有关?
输出:清晰且能可靠触发问题的复现步骤。
阶段 2:隔离(缩小范围)
目标:将搜索范围从“整个代码库”缩小到“特定组件”。
技术:
二分查找:
- 确定两个状态:正常状态和故障状态
- 测试中间状态
- 对出现故障的一半递归执行
- 继续,直到找到引入变更
Git 二分查找(用于回归问题):
git bisect start
git bisect bad HEAD
git bisect good <known-good-commit>
# Git will checkout commits for testing
# After each test:
git bisect good # or git bisect bad
# Continue until culprit found
排除代码:
- 注释掉部分代码以隔离问题
- 创建最小复现案例
- 移除所有非必要内容
环境隔离:
- 单独运行失败路径(最小复现;仅在用户要求编写测试时才编写单元测试)
- 比较正常与故障环境
- 使用全新安装以排除污染因素
输出:“Bug 位于[特定组件/函数/代码行范围]”
阶段 3:诊断(理解根本原因)
目标:准确了解 Bug 为什么会发生,而不只是知道它发生在哪里。
科学方法:
- 观察:究竟发生了什么?
- 提出假设:为什么可能会发生这种情况?
- 预测:如果假设正确,还有什么情况也应该成立?
- 测试:用证据验证预测
- 迭代:根据结果完善假设
日志策略:
// Add strategic logging at boundaries
console.log("[DEBUG] Function entry:", { input, state });
console.log("[DEBUG] After processing:", { result, sideEffects });
console.log("[DEBUG] Function exit:", { returnValue });
常见根本原因:
| 症状 | 可能原因 |
|---|---|
| 本地正常,在 CI 中失败 | 环境差异、时序、资源 |
| 间歇性故障 | 竞态条件、不稳定的网络、资源争用 |
| 先正常运行,之后停止工作 | 状态变更、内存泄漏、缓存污染 |
| 数据错误 | 类型强制转换、编码、时区、精度 |
| 静默失败 | 异常被吞掉、异步错误、缺少 await |
输出:提供证据的根本原因清晰说明。
阶段 4:修复与验证(解决问题并防止复发)
目标:修复问题并防止回归。
修复流程:
- 实施最小修复 - 尽可能少做改动
- 检查类似模式 - 其他地方是否存在同样的 Bug?
- 检查修复的副作用 - 阅读其涉及的调用方、输入和错误路径
- 记录修复 - 说明问题为何发生,以及如何预防
仅在用户要求编写测试时,才编写能复现 Bug 的失败测试。
验证清单:
- 审查确认已解决阶段 3 中找到的根本原因,而不只是处理症状
- 修复已产生的输出(复现结果、执行成功的命令)能够验证修复有效
- 修复在所有受影响的环境中均有效
- 未引入新的警告或错误
预防措施:
- 在边界处添加保护措施和验证
- 改进错误消息,便于今后调试
- 记录其他开发者需要注意的问题
- 考虑架构变更能否防止类似 Bug
调试反模式
不要:
- 猜测并抱有侥幸(随意修改)
- 没有证据就断定问题所在
- 相信注释和文档,而不看代码的实际行为
- 用打印语句调试生产环境,之后却忘记移除
- 只修复症状,而不解决根本原因
- 一次进行多项修改
应该:
- 用证据验证假设
- 一次只改一项
- 记录实际值,而不是预期值
- 相信代码,而不是文档
- 陷入困境时休息一下(换个思路会有帮助)
快速参考
1. REPRODUCE → Can I reliably trigger this?
2. ISOLATE → Where exactly is it failing?
3. DIAGNOSE → Why is it failing?
4. FIX → How do I fix it permanently?
输出模板
## Bug Investigation: [Title]
### Reproduction
- Steps to reproduce
- Environment details
- Frequency
### Isolation
- Search method used
- Scope narrowed to
### Root Cause
- What's actually wrong
- Why it happens
- Evidence
### Fix
- Code changes made
- What review confirmed, and what it couldn't
### Prevention
- How to prevent similar bugs
- Documentation updates
评论
支持 Markdown