关于 systematic-debugging
面向开发者和编码 Agent 的调试技能,强调先查明根因再修改代码。它分阶段指导收集证据、逐一验证假设,并在多次修复失败后升级处理。
主要功能
- 01读取错误并复现问题
- 02检查近期变更与数据流
- 03收集跨组件证据
- 04逐一验证单个假设
- 05多次修复失败后升级处理
适用场景
- 01调查可复现的缺陷
- 02追踪跨系统边界的故障
- 03修复失败后重新评估方案
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ izyanrajwani/ agent-skills-library --skill systematic-debugging安装后在 Claude Code 中输入/systematic-debugging确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/condition-based-waiting.mddefense-in-depth.mdroot-cause-tracing.mdscripts/condition-based-waiting-example.tsfind-polluter.sh详细介绍
系统化调试
核心原则: 修复前先找到根本原因。只修复症状注定会失败。
NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST
阶段 1:根本原因调查
在尝试任何修复之前:
-
仔细阅读错误消息
- 完整阅读堆栈跟踪
- 记下行号、文件路径和错误代码
- 不要跳过警告
-
稳定复现
- 确切的步骤是什么?
- 如果无法复现 → 收集更多数据,不要猜测
-
检查近期更改
- Git 差异、近期提交
- 新依赖项、配置更改
- 环境差异
-
在多组件系统中收集证据
当系统包含多个组件时(CI → 构建 → 签名、API → 服务 → 数据库):
提出修复方案前,先添加诊断检测:
For EACH component boundary: - Log what data enters/exits component - Verify environment/config propagation - Check state at each layer Run once to gather evidence → analyze → identify failing component示例:
# Layer 1: Workflow echo "=== Secrets available: ===" echo "IDENTITY: ${IDENTITY:+SET}${IDENTITY:-UNSET}" # Layer 2: Build script env | grep IDENTITY || echo "IDENTITY not in environment" # Layer 3: Signing security find-identity -v -
追踪数据流
有关向后追踪技术,请参阅
references/root-cause-tracing.md。简要来说:错误值从哪里产生?沿调用链向上追踪,直到找到源头。在源头修复。
阶段 2:模式分析
- 查找可用示例 - 在代码库中查找类似的可用代码
- 与参考实现进行比较 - 完整阅读参考实现,不要略读
- 找出差异 - 列出所有差异,不要想当然地认为“这无关紧要”
- 了解依赖项 - 组件、配置、环境、假设
阶段 3:假设与测试
- 提出单一假设 - “我认为 X 是根本原因,因为 Y”——具体说明
- 进行最小测试 - 尽可能小的更改,一次只改一个变量
- 验证 - 修复有效?→ 阶段 4。无效?→ 提出新假设,不要叠加修复
- 不知道时 - 直说。不要假装知道。
阶段 4:实施
-
创建失败的测试用例
- 使用
test-driven-development技能 - 修复前必须创建
- 使用
-
实施单一修复
- 一次只做一项更改
- 不要顺便进行改进
-
验证修复
- 测试通过了吗?其他测试仍然通过吗?问题解决了吗?
-
修复无效时
- 统计尝试次数
- 如果 < 3:根据新信息返回阶段 1
- 如果 ≥ 3:升级处理(见下文)
升级处理:3 次或更多修复失败
表明存在架构问题的模式:
- 每次修复都会在其他地方暴露新问题
- 修复需要大规模重构
- 不断出现共享状态/耦合问题
处理方式: 停下。质疑基本假设:
- 这种模式在根本上是否合理?
- 我们是否只是惯性地继续?
- 应该重构架构,还是继续修复症状?
继续尝试修复前,先与人类伙伴讨论。 这是架构错误,而非假设失败。
警示信号 → 停下并返回阶段 1
如果你发现自己在想:
- “先快速修复,之后再调查”
- “先试试改 X”
- “我跳过测试吧”
- “大概是 X”
- “模式建议用 X,但我会用别的方式改写”
- 尚未追踪数据流就提出解决方案
- 失败 2 次或更多后还想“再修一次”
表明你偏离方向的人类信号
- “这不是没发生吗?” → 你未经验证就下了结论
- “这能让我们看到……吗?” → 你本该添加证据收集
- “别再猜了” → 你还没弄清楚情况就提出修复方案
- “深入思考” → 质疑基本假设
- 对方沮丧地问“我们卡住了吗?” → 你的方法不起作用
应对方式: 返回阶段 1。
辅助技术
references/ 中的参考文件:
root-cause-tracing.md- 沿调用栈向后追踪缺陷defense-in-depth.md- 找到根本原因后,在多个层级添加验证condition-based-waiting.md- 用基于条件的轮询替代任意超时
相关技能:
test-driven-development- 创建失败的测试用例(阶段 4)verification-before-completion- 宣称成功前验证修复
评论
支持 Markdown