Skip to content

3.13 调试与排错

预计耗时:12 分钟

本关任务简报

Claude Code 大多数时候工作良好,但它不是不会出问题:有时候会陷入循环、坚持错误方案、消耗完上下文还没搞定任务、或者工具调用一直报错。

这类情况不是 Claude 变笨了,而是工作流出了问题——上下文污染、任务边界不清、错误的反馈方式。知道如何诊断和修复这些问题,你才能在出问题时快速止损,而不是干等或者放弃。


开始前先检查装备

前置知识说明
进阶使用前几节这一关是"出了问题怎么处理",需要你先有实际使用经验,否则这里的信号和场景对你来说还是抽象的
2.6 会话管理 →/compact/clear/cost 等命令是这一关的核心工具

通关奖励:解锁以下技能

  • 🔍 能识别 Claude Code 常见的失控信号
  • 💰 会用 /cost 监控 token 消耗,在合适的时机干预
  • 🔄 掌握"上下文污染"的处理方法
  • 🛑 知道什么时候该中断、什么时候该重来、什么时候该换策略

机制解析

识别失控信号

Claude Code 出问题时,通常有几个可识别的信号:

信号含义处理方向
同一个错误反复出现 3 次以上Claude 在循环,没有真正理解根本原因中断,重新描述问题
改了 A,又改了 B,又改回了 A上下文矛盾,Claude 在不同指令间摇摆中断,明确一个方向
工具调用数量异常多(10 次以上没有明显进展)探索没有聚焦中断,缩小问题范围
回复开始变短、变模糊、重复之前说过的内容上下文接近上限,Claude 开始丢信息/compact/clear
开始给出"建议你考虑..."但不实际执行任务对当前上下文来说太复杂拆分任务,新会话处理

工具一:/cost 监控消耗

text
/cost

/cost 显示当前会话已消耗的 token 和估算费用。有几个判断标准:

  • Context 使用率 < 50%:没问题,继续工作
  • Context 使用率 > 70%:考虑 /compact,否则后续回复质量下降
  • Context 使用率 > 90%:必须 /compact 或开新会话,再不处理会直接出错

养成习惯:每隔 15-20 轮对话看一次 /cost,在出问题之前主动干预。


工具二:中断和倒回

Escape 中断:Claude 的回答方向不对,或者正在做错误的事,立刻按 Escape。不用等它说完,说完了反而更难纠正,因为那时候错误的内容已经进了上下文。

双击 Escape 倒回:如果 Claude 做了几步错误操作,用倒回功能撤销到问题出现之前的那一轮。倒回菜单会让你选恢复范围——代码和对话一起回、只回对话、或只还原代码。它能还原 Claude 用编辑工具改的文件,但管不了 bash 命令(rm/mv 等)造成的改动,也不替代 Git。完整说明见 2.6 会话管理 →


工具三:上下文污染处理

"上下文污染"是指会话里积累了过多错误的信息、矛盾的指令、或者跑偏方向的内容,导致 Claude 后续的表现越来越差。

判断方法:让 Claude 复述它当前的理解:

text
停一下。告诉我你现在对这个任务的理解是什么,
你打算怎么做,目前完成了哪些步骤。

如果它的复述里有明显的误解,说明上下文已经污染了。

处理方法(按严重程度):

  1. 轻微污染:直接纠正,明确说"之前我说的 X 是错的,正确的应该是 Y"
  2. 中度污染/compact 压缩后继续,压缩会保留核心信息但去掉无用对话
  3. 严重污染/clear 清空上下文,新会话里用更好的方式重新描述任务

工具四:工具调用失败的排查

当 Claude 的某个工具调用一直报错,不要只是反复让它"再试一次":

第 1 步:让 Claude 解释它打算怎么做

text
先不要执行,告诉我你接下来打算运行什么命令,理由是什么。

有时你会发现 Claude 计划做一件根本不存在的事。

第 2 步:自己手动运行命令验证

在 Claude Code 里用 !命令 手动执行,直接看错误信息:

text
!npm run test -- --testFile=auth.test.ts

把真实的错误信息贴给 Claude,比让它猜要高效得多。

第 3 步:缩小范围

工具失败时,缩小范围比扩大范围更有用:

❌ 帮我运行所有测试并修复所有错误
✅ 帮我只运行 auth.test.ts,只修复第一个失败的测试

常见失控场景及处理

场景:Claude 反复给出相同的错误答案

text
我注意到你连续三次给出了类似的方案,但都没有解决问题。
先不要再给方案。帮我做一件事:
列出你认为这个 bug 可能的根本原因(3-5 个),
每个可能性说明你的推理依据。
我来判断哪个方向值得继续探索。

把"给答案"改成"列假设",强迫 Claude 重新推理而不是重复同一个方向。

场景:Claude 一直在修改代码但没有越来越好

每次修改后都要求验证:

text
在继续改下一个地方之前,先运行一次测试,确认这次修改没有引入新问题。

让每一步有验收标准,避免"改了一大堆,最后哪里出问题都不知道"。

场景:任务进行到一半,Claude 说"这个任务太复杂了,需要更多信息"

这通常意味着任务边界不清楚。不要试图"补充信息",而是重新拆任务:

text
好,我们只做这个任务里最小的、最独立的一步:[具体说是哪步]
其他的下一个会话再处理。

开始闯关

目标:主动制造一个"失控场景",然后用这关的工具把它处理掉。

第 1 步:运行 /cost,记录当前状态

在一个已经工作了一段时间的会话里运行 /cost,记下 Context 使用率。

第 2 步:让 Claude 复述当前任务理解

text
停一下。告诉我你现在认为我们正在做什么任务,
你已经完成了哪些步骤,接下来计划做什么。

如果复述有偏差,练习用"直接纠正"的方式校正而不是重新开会话。

第 3 步:练习主动 /compact

Context 使用率超过 60% 时,主动运行 /compact,观察压缩后 Claude 的状态有没有变化。


通关检定

  • [ ] 能识别至少 3 种 Claude Code 失控信号
  • [ ] 用过 /cost 查看 token 消耗,知道什么时候该干预
  • [ ] 知道上下文污染的判断方法(让 Claude 复述当前理解)
  • [ ] 知道 Escape / 双击 Escape 各自能做什么
  • [ ] 遇到工具反复失败时,知道缩小范围比扩大范围更有用

全部点亮就算通关 ✓


卡关了?翻车指南在这

任务工程量大、逻辑复杂,Claude 屡次出错,感觉越改越乱

这是正常的,不是 Claude 变笨了——复杂任务本来就需要调试。应对方法:逐步定位,不要试图一次修完。先让 Claude 描述它对问题的当前理解,确认它抓住了正确的根本原因;每次只修一个地方,修完立刻验证;如果 N 次修改之后还在绕圈子,说明上下文已经被错误信息污染,果断开新会话重新描述问题。

有时候重来一次的成本远低于继续在一个污染会话里死磕。

Claude 说任务太复杂、工具调用次数达到上限、或者突然停止执行

Claude Code 对单次会话有处理边界:工具调用轮次有上限,上下文窗口也有限。如果 Claude 停在中途说"任务太大"或不再执行操作,说明你碰到了这个边界。

解决方法:

  1. 记录当前完成了哪些步骤(让 Claude 总结一下进度)
  2. 提交当前的 git 状态,建一个干净的检查点
  3. 开新会话,告诉 Claude"我们已经完成了 X,现在只需要做 Y"

把大任务拆成多个小会话是处理这类边界最有效的方法,详见 3.11 大型代码库处理 →

Claude 做了很多工具调用,但文件改得一团糟,怎么恢复

首先检查 git 状态:

bash
git diff
git status

如果代码在 git 追踪范围内,git checkout . 可以还原所有未提交的改动。好习惯是在每次开始重要任务前先 git add && git commit,这样随时有干净的回滚点。

/compact 之后 Claude 忘了很多重要信息

/compact 会保留核心内容,但确实会丢失细节。遇到这种情况,在 /compact 之后主动把关键信息补充给 Claude:

text
/compact 之后,提醒你几个重要的约定:
- 我们正在修复的是登录超时的 bug
- 已经确认问题在 session.service.ts 第 47 行
- 解决方案是延长 TTL 而不是修改刷新逻辑

Claude 一直不停地执行,不暂停等我确认

这通常是因为切到了 accept edits on 模式。按 Shift+Tab 切回默认模式(无标记),这样每步工具调用都会暂停等你确认。对复杂任务,默认模式才能保持你的控制权。


下一关

3.14 远程控制:手机操控 Claude Code →

学会从失控状态恢复后,最后一关讲一个很实用的新能力——让电脑上跑着的会话能用手机随时接管,干活不必守在电脑前。

面向公开用户维护,内容基于 Claude Code 官方文档与真实使用经验整理