关于 shared-bug-investigation
面向开发者的系统化 Bug 调查技能,以科学方法从可复现的问题出发,定位根因并验证修复及回归测试。
主要功能
- 01项目与环境信息收集
- 02复现问题并记录证据
- 03提出并排序可测试假设
- 04控制变量实验与根因分析
- 05验证修复并执行回归测试
适用场景
- 01调查间歇性或稳定复现的故障
- 02追查代码、状态或集成问题
- 03检查修复是否引入回归
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ desquared/ agents-rules-skills --skill shared-bug-investigation安装后在 Claude Code 中输入/shared-bug-investigation确认已加载。
附带文件references/debugging-techniques.mdreferences/quick-reference.md
详细介绍
Bug 调查——科学方法
运用科学方法系统地调查并解决软件 Bug。
科学方法流程
- 观察 - 收集问题相关数据
- 提出假设 - 形成可检验的解释(按可能性排序)
- 实验 - 通过受控变更检验假设
- 分析 - 客观解读结果
- 得出结论 - 找出根本原因并验证修复
核心原则
- 先了解上下文 - 调查前先了解项目
- 以假设为导向 - 形成可检验的假设之前,绝不贸然寻找解决方案
- 隔离变量 - 一次只改变一项
- 可靠复现 - 无法复现的问题就无法修复
- 追根究底,不只处理症状 - 深入探究,不满足于表面修复
- 严格验证 - 确认修复解决问题且没有引入回归
调查工作流
阶段 1:项目上下文(2-5 分钟)
调查前先了解:
- 语言及版本(Python 3.11、Java 17、Go 1.21 等)
- 构建系统(Gradle、npm、Cargo、Make 等)
- 关键依赖和框架
- 架构模式(MVC、微服务等)
- 测试配置
快速了解:
# Find package managers
view package.json / requirements.txt / Cargo.toml / pom.xml
# Check config files
view .env / config.yml / settings.py
# Identify entry points
view main.* / index.* / app.*
输出:一行上下文描述
Python 3.11, Flask API, PostgreSQL, pytest, Docker
阶段 2:问题定义
收集:
- 错误消息(完整文本、代码)
- 堆栈跟踪 / 日志
- 复现步骤
- 预期行为与实际行为
- 环境(操作系统、版本、配置)
- 可复现性(总是 / 有时 / 很少)
记录:
Bug: [Short description]
Reproduces: [Always/Sometimes/Unable]
Error: [Key error message]
Steps:
1. [Action 1]
2. [Action 2]
3. [Failure occurs]
Expected: [What should happen]
Actual: [What happens]
阶段 3:假设(按可能性排序)
阶段 3:假设(按可能性排序)
提出 2-4 个可检验的假设,并按可能性排序。
H1:[最可能的原因]
- 支持证据:[此原因可能性较高的原因]
- 测试:[如何证实或证伪]
- 如果为真:[预期结果]
- 如果为假:[预期结果]
H2:[其他可能的原因]
- 支持证据:[支持性观察]
- 测试:[可证伪的实验]
常见类别:
- 逻辑错误(差一错误、运算符错误、条件不正确)
- 状态问题(竞态条件、未初始化、数据过时)
- 类型 / 数据问题(null/nil、类型不匹配、解析错误)
- 并发问题(数据竞争、死锁、线程安全)
- 集成问题(API 不匹配、版本不兼容)
- 环境问题(配置、平台特定问题、资源限制)
阶段 4:实验
针对每个假设:
测试 H1:[假设名称]
- 变更:[要修改的一个变量]
- 测量:[要观察的内容]
- 方法:[具体步骤]
- 结果:[实际结果]
- 结论:[已证实 / 已证伪]
技巧:
- 在关键位置添加日志
- 使用调试器断点
- 二分搜索(移除一半代码)
- 最小复现(精简至必要内容)
- 对比正常与故障状态
- 隔离组件
阶段 5:根本原因
已确认: [清楚说明实际原因]
证据: [从观察 → 假设 → 验证的证据链]
发生原因:
- 直接原因:[技术原因]
- 促成因素:[导致问题出现的因素]
- 系统性原因:[如有,更深层的问题]
阶段 6:解决方案与验证
修复: [要进行的具体变更]
为何有效: [解释因果关系]
验证:
- 复现 Bug(确认失败)
- 应用修复
- 重新测试(确认成功)
- 测试边界情况
- 运行测试套件(确认没有回归)
- 为此 Bug 添加测试
预防:
- [要添加的测试]
- [要添加的断言]
- [要避免的模式]
调查技巧
二分搜索: 移除一半代码,测试 Bug 是否仍然存在。针对故障部分重复此过程,直到定位问题。
最小复现: 精简至少于 50 行且能复现问题的代码,去除干扰。
差异测试: 对比正常与故障状态(提交、版本、配置)。
策略性日志: 在关键决策点添加输出,追踪执行流程。
橡皮鸭调试法: 大声逐行讲解代码,通常能发现逻辑错误。
常见错误模式(与语言无关)
逻辑错误:
- 差一错误:
i < n与i <= n - 运算符错误:
&&与||,==与= - 否定错误:
!condition的逻辑反转
状态问题:
- 竞态条件:并发访问未进行同步
- 未初始化:变量尚未赋值就被使用
- 状态过期:使用过时的缓存数据
类型/数据:
- 空值/nil 解引用
- 类型强制转换错误
- 整数溢出
- 浮点精度
并发:
- 死锁:相互等待锁
- 数据竞争:未同步地访问共享数据
- 线程安全:在多个线程上运行非线程安全代码
集成:
- API 契约不匹配
- 版本不兼容
- 缺少依赖项
- 配置错误
输出格式
# Bug Investigation: [Name]
## Context
[One-line: Language, framework, architecture]
## Problem
Error: [Message]
Reproduces: [Always/Sometimes]
Steps: [1,2,3]
## Hypotheses
H1: [Most likely] - Test by [method]
H2: [Alternative] - Test by [method]
## Investigation
Tested H1: [Result - validated/invalidated]
[If needed] Tested H2: [Result]
## Root Cause
[One sentence explanation]
Evidence: [What confirmed it]
## Solution
Fix: [Specific change]
Why it works: [Explanation]
Validated: [Tested successfully]
## Prevention
- Test added: [Description]
- Warning signs: [What to watch for]
快速决策树
症状 → 可能类别:
- 间歇性故障 → 并发/状态
- 总是以相同方式失败 → 逻辑错误
- 空值/nil 崩溃 → 类型/数据
- 仅在特定环境中出现 → 配置
- 性能下降 → 资源/算法
- 更新依赖项后出现 → 集成
重要提醒
- 从发现上下文开始
- 编码前先提出假设
- 每次只更改一个变量
- 修复前先复现问题
- 严格验证修复
- 添加回归测试
- 记录根本原因
评论
支持 Markdown