通过四阶段调试流程,为缺陷或错误提供系统性的根本原因分析和经验证的修复方案,不依赖猜测或过早修复。
Iron Law.是一项面向实际任务的技能,主要用于NO FIXES 没有 ROOT CAUSE INVETIGATION FIRST. 调试症状会生成 right- a- mole 调试. 每个不解决根源的修复都会使下一个调试更难.。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
未经根本原因调查,绝不修复。
仅修复表象会导致“打地鼠式”调试:每一次未触及根本原因的修复,都会让下一个 Bug 更难定位。务必先定位根本原因,再实施修复。
在形成任何假设前,先全面收集上下文信息。
收集表象现象:仔细阅读错误信息、堆栈跟踪(stack traces)及复现步骤。若用户未提供足够上下文,请每次仅提出 一个问题,切勿一次性追问五个问题。
阅读代码:从表象现象出发,逆向追踪代码执行路径,直至潜在成因。搜索所有相关引用,通读故障点周边逻辑。
检查近期变更:
git log --oneline -20 --
该功能此前是否正常?哪些内容发生了变更?若为回归问题(regression),则根本原因必然存在于 diff 中。
尝试复现:能否以确定性方式触发该 Bug?若无法稳定复现,请先补充更多证据,再继续推进。
检查内存记录:回顾此前在同一模块/文件中的调试会话。相同文件中反复出现 Bug 是一种架构异味(architectural smell)。
输出要求:“根本原因假设:……” —— 一项具体、可验证的陈述,明确指出问题所在及其成因。
检查该 Bug 是否符合已知典型模式:
竞态条件(Race condition) …… 表现为偶发性、依赖时间顺序的问题。重点关注共享状态的并发访问。
空值传播(Nil/null propagation) …… 如 NoMethodError、TypeError。通常因对可选值缺乏防护逻辑所致。
状态损坏(State corruption) …… 数据不一致、更新不完整。需检查事务、回调(callbacks)、钩子(hooks)等机制。
集成失败(Integration failure) …… 如超时、响应异常。常见于外部 API 调用或服务边界交互。
配置漂移(Configuration drift) …… 本地运行正常,但在 staging/prod 环境失败。需排查环境变量、功能开关(feature flags)、数据库状态等。
缓存陈旧(Stale cache) …… 展示过期数据,清除缓存后即恢复正常。涉及 Redis、CDN、浏览器缓存等。
还需检查:
外部搜索:若 Bug 不匹配任一已知模式,请在线搜索对应错误类型。前提:务必先脱敏—— 移除主机名、IP 地址、文件路径、SQL 片段、客户数据等敏感信息。应按错误类别(error category)而非原始错误消息进行搜索。
在编写任何修复代码前,必须先验证你的假设。
确认假设:在疑似根本原因位置添加临时日志、断言(assertion)或调试输出。运行复现流程,观察证据是否支持假设。
若假设错误:对错误信息进行脱敏后重新搜索;返回第一阶段,进一步收集证据。严禁凭猜测推进。
三击不中规则(3-strike rule):若连续三个假设均被证伪,请立即暂停,并告知用户:
“已验证三个假设,均未匹配。该问题可能属于架构层面缺陷,而非简单 Bug。”
后续可选方案:
危险信号(Red flags) …… 若出现以下任一情况,请立即放慢节奏:
待根本原因确认无误后:
修复根本原因,而非表象。 采用最小必要变更,直接消除真实问题。
保持 diff 最小化:修改最少的文件数、最少的代码行数。克制重构邻近代码的冲动。
编写回归测试(regression test),确保其满足:
运行完整测试套件。 不允许引入任何新的回归问题。
若修复涉及超过 5 个文件:请在执行前向用户明确提示影响范围(blast radius)。对一个 Bug 修复而言,此规模过大。
全新验证:严格复现原始 Bug 场景,并确认其已被解决。此步骤不可跳过。
运行全部测试套件。
输出结构化调试报告:
DEBUG REPORT
将本报告保存至 memory/ 目录,文件名含今日日期,以便后续调试会话引用。