关于 systematic-debugging
Systematic Debugging 是面向开发者的调试指南,强调复现问题、追溯根因以及逐一验证假设。修复尝试失败三次后,指南要求停下并重新审视架构。
主要功能
- 01问题分析与复现清单
- 02向上追溯根因
- 03逐一验证单个假设
- 04先编写失败测试再修复
- 05三次修复失败后审视架构
适用场景
- 01调查可复现的缺陷
- 02追踪错误值的来源
- 03多次修复失败后重新评估设计
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ bbeierle12/ skill-mcp-claude --skill systematic-debugging安装后在 Claude Code 中输入/systematic-debugging确认已加载。
附带文件_meta.json
详细介绍
系统化调试
核心原则
不要猜测。要系统地调查。
修复尝试失败 3 次后,立即停下来审视架构。
阶段 1:了解问题
收集信息
- 预期行为是什么?
- 实际行为是什么?
- 问题从什么时候开始出现?
- 最近有哪些变化?
稳定复现
- 创建最小复现案例
- 记录复现问题的确切步骤
- 确认问题是确定性出现还是偶发出现
先检查显而易见的问题
- 接通了吗?(服务正在运行,依赖项已安装)
- 你在正确的环境中吗?
- 文件保存了吗?
- 缓存清除了吗?
阶段 2:追踪根本原因
反向追踪技巧
- 错误值出现在哪里?
- 是什么用这个错误值调用了这里?
- 不断向上追踪,直到找到源头
- 从源头修复,而不是处理症状
查找可用示例
- 在同一代码库中找到类似的可用代码
- 类似的问题中,哪些情况是正常的?
- 与参考内容进行比较
找出差异
- 正常情况与异常情况有什么不同?
- 列出每一处差异,无论多么细微
- 不要想当然地认为“这不可能有影响”
阶段 3:形成假设
科学方法
- 形成一个假设
- 预测假设成立时会看到什么
- 设计测试来验证
- 运行测试
- 如果不成立,根据新数据形成新的假设
不要同时提出多个假设
- 一次只验证一个假设
- 完整测试后再继续
- 不要混用调试方法
阶段 4:实施修复
先编写失败测试
- 编写能复现错误的测试
- 修复前,测试应该失败
- 修复后,测试应该通过
一次只进行一项修复
- 只做一项改动
- 不要顺手做改进
- 不要捆绑重构
完整验证
- 原有测试通过
- 其他测试未受影响
- 问题确实已解决
- 已覆盖边缘情况
阶段 5:修复无效时
每次尝试失败后
- 停下来
- 统计:你尝试了多少次修复?
- 如果少于 3 次:返回阶段 1,根据新信息重新分析
- 如果达到或超过 3 次:停下来审视架构
修复尝试失败 3 次或更多后
以下模式表明可能存在架构问题:
- 每次修复都会在其他地方暴露新问题
- 修复需要“大规模重构”
- 每次修复都会引发新的症状
停下来并自问:
- 这种模式从根本上是否合理?
- 这是合适的抽象吗?
- 是否应该重新设计?
调试工具
日志策略
// Add context to logs
console.log('[ComponentName] methodName:', {
input,
state: relevantState,
timestamp: Date.now()
});
二分调试法
- 在可疑代码的中间位置添加日志
- 判断问题出现在前面还是后面
- 重复上述步骤,直到定位问题
橡皮鸭调试法
大声解释问题:
- 应该发生什么?
- 实际发生了什么?
- 我尝试了什么?
- 我在做出哪些假设?
常见陷阱
避免这些错误
- 同时更改多项内容
- 假定自己知道原因
- 只修复症状,而不解决根本原因
- 不验证修复是否确实有效
- 不添加回归测试
危险信号
- “在我的机器上能正常运行”
- “昨天还好好的”
- “我什么都没改”
- “问题不可能出在这里”
评论
支持 Markdown