「帮我修一下这个 bug」——这是和 Claude Code 最常见的对话,也是最容易出问题的对话。
不是因为 Claude Code 调试能力差,而是因为调试任务对「上下文精准度」的要求特别高。给的信息对,Claude 能在几分钟内定位并修复复杂 bug;信息不够,Claude 会在错误的方向乱试一通。
调试的黄金规则:症状 + 位置 + 期望状态
每次描述 bug,包含这三要素:
# 完整的调试提示格式
[症状]:[具体错误信息或异常行为]
[触发条件]:[什么情况下发生]
[位置]:[相关文件或模块]
[期望状态]:[正常情况下应该怎样]
# 示例
症状:用户登录后刷新页面返回 401,需要重新登录
触发条件:session token 过期后刷新触发
位置:src/auth/session.ts,特别是 refreshToken 函数
期望:token 自动刷新,用户无感知继续使用让 Claude 先写失败测试,再修复
这是调试最有效的模式,没有之一:
"users report login fails after session timeout.
check auth flow in src/auth/, especially token refresh.
Write a failing test that reproduces the issue, then fix it."为什么先写测试:
- 测试是对「什么是 bug」最精确的定义
- 修复后立刻有验证手段
- 防止以后相同 bug 复现
- Claude 有了可以自我验证的标准,不依赖你反复 review
错误信息的正确用法
把完整错误堆栈贴进去
# 差的
"build is failing, help me fix it"
# 好的
"build fails with this error:
[贴完整的错误堆栈]
Fix root cause. Verify build succeeds. Don't suppress the error."「不要压制错误」这一句话很重要——Claude 偶尔会为了让报错消失而用 try-catch 包住问题,而不是真正修复。明确告诉它要解决根因。
使用管道直接发送日志
# 把错误日志直接发给 Claude
cat error.log | claude
# 或者运行命令后把输出发给 Claude
npm run build 2>&1 | claude "fix these build errors"在 VS Code 插件里,点「Include terminal output」直接把最新的终端输出加入上下文。
不同类型 bug 的调试策略
类型 1:明确位置的 bug
"@src/auth/session.ts#45-80 这段 token 刷新逻辑有竞态条件:
多个请求同时触发刷新时,只有一个能成功。
分析并修复并发问题。"精确的文件和行号让 Claude 直接看到问题代码,而不是先花时间搜索。
类型 2:行为异常但位置不明确
"用户报告:提交空表单时不显示错误提示。
在表单提交流程里找出为什么验证不生效:
- 先检查 @src/components/LoginForm.tsx 的提交处理
- 再检查 @src/utils/validation.ts 的验证逻辑
- 如果需要,进一步追踪调用链"给出调查方向,避免 Claude 漫无目的地探索整个代码库。
类型 3:性能问题
"API /api/users/list 在数据量超过 1000 条时响应超过 5 秒。
分析 @src/api/users.ts 的查询逻辑,找出性能瓶颈。
目标:响应时间降到 500ms 以内。"性能 bug 必须给出可测量的目标,否则 Claude 不知道什么程度算「修好了」。
类型 4:间歇性 bug
"以下错误在生产环境偶发,本地难以复现:
[错误信息]
根据调用栈分析根因:
1. 看 src/queue/ 是否有竞态条件
2. 检查是否有资源没有正确释放
3. 分析是否是异步处理的时序问题
不要只修症状,要找到根因并添加相应的防御性代码。"用子 Agent 做代码库范围的调查
当 bug 可能来自多个模块,不确定具体位置时:
"use a subagent to investigate all places where user session state
is read or written, and identify any inconsistencies."子 Agent 在独立上下文里搜索,不会污染主会话的上下文。结束后汇报发现,你再决定怎么修。
调试时的上下文管理
及时 /compact:调试过程中可能尝试多种方案,失败方案的记录会污染上下文。每次尝试新方向前,用 /compact 保留关键信息,清除失败路径。
两次失败就重来:同一问题被纠正超过两次,说明上下文已经被错误方向污染。/clear 后用学到的信息写更精确的提示重试。
用 /rewind 回退:Claude 改了代码后发现方向错了:
Esc+Esc # 打开 rewind 菜单
# 选「只恢复代码」,保留对话历史验证修复的标准套路
修复完成后:
1. 运行失败测试,确认它现在通过
2. 运行整个测试套件,确认没有引入新问题
3. 如果是 UI bug,截图验证视觉效果
4. 提交前运行 typecheck 和 lint把这个写进 CLAUDE.md,每次调试 Claude 都会自动执行验证。
快速调试场景提示词模板
# 编译/构建错误
"[贴完整错误]. Fix root cause, verify [build command] succeeds. Don't suppress."
# 运行时异常
"[症状] at [位置]. Write test reproducing the bug, then fix."
# 性能问题
"[操作] takes [时间], should be under [目标]. Profile @[文件], fix bottleneck."
# 视觉 bug
"[粘贴截图] [描述差异]. Fix and screenshot to verify."来源:Claude Code 官方 Best Practices | f22labs Claude Code Productivity Tips | 整理:ClaudeEagle