|

解決 Claude Code 卡住問題:6 大根因和發消息復活的真相

用過 Claude Code 的開發者都遇到過這種畫面:終端裏彈出一行 「Symbioting… (3m 12s · ↓ 5.7k tokens)」,進度條像被凍住一樣,幾分鐘沒有任何新輸出。你試着發了一句"還在嗎?",沒想到 Claude 立刻接着幹活,把剛纔那段任務繼續推完。

這種「卡住 + 發消息復活」的詭異體驗,看起來玄學,其實背後是 Anthropic 流式協議、超時機制和上下文管理的幾個具體故障模式疊加出來的。本文基於 Claude Code 官方故障排查文檔以及 GitHub Issues #25979、#24688、#39718、#25286、#25539、#51659 等英文一手資料,系統講清楚 Claude Code 卡住的真實原因,並給出可立即上手的 7 種恢復方法和 5 條預防策略。

核心價值: 讀完本文,你將知道每種 spinner 動詞背後的狀態含義、爲什麼發消息有時能復活、什麼時候必須 Ctrl+C 重啓,以及如何把卡住率降到接近爲零。

claude-code-stuck-hanging-troubleshooting-guide-zh-hant 图示

Claude Code 狀態指示器全解讀

要排查"卡住"問題,第一步是看懂 Claude Code 在終端裏給你的那行狀態。截圖裏的 Symbioting… (3m 12s · ↓ 5.7k tokens) 看似神祕,其實是一段結構化信息,每個部分都有明確意義。

字段 示例值 含義
Spinner 動詞 Symbioting… 當前階段的擬人化描述,2.1.23 起可自定義
已等待時長 3m 12s 從這一輪開始計時到現在的累計耗時
流向箭頭 ↓ 表示正在從 API 接收數據,↑ 表示正在發送
Token 計數 5.7k tokens 當前已經下載/上傳的 token 數量

Claude Code 內置了 187 個默認 spinner 動詞,Befuddling、Ruminating、Accomplishing、Symbioting 都是其中之一。它們只是爲了讓等待體驗更生動,沒有任何技術差異。2.1.23 版本之後引入了 spinnerVerbs 配置項,社區甚至有 1900+ 自定義動詞包可以替換。

判斷 Claude Code 是不是真的卡住,關鍵不在動詞,而在兩件事:時長是否還在漲token 計數是否還在動。如果 3m 12s 後過 30 秒變成 3m 42s 但 token 計數還停在 5.7k,那基本可以判定流式響應已經停滯。

如果你在國內通過 API易 apiyi.com 等中轉平臺調用 Claude API,狀態行字段意義和官方完全一致,可以用同一套判斷方法定位問題。

Claude Code 卡住的 6 大根因

理解了狀態指示器後,就能對照實際表現來定位根因。下面這 6 個原因按出現頻率排序,覆蓋了 GitHub Issue tracker 上 90% 以上的真實案例。

claude-code-stuck-hanging-troubleshooting-guide-zh-hant 图示

根因 1:API 流式響應靜默中斷

這是最常見也最隱蔽的根因,對應 GitHub Issue #25979。Claude Code 的 HTTP 客戶端沒有 read timeout 機制,一旦上游 API 在傳輸中途停止發包,進程會一直停在 epoll_wait 內核狀態等待新數據,UI 上 spinner 繼續轉,但 token 計數完全不漲。常見誘因包括跨境網絡抖動、tmux 多路複用、SSH 長連接斷流等。

根因 2:工具調用 payload 過大觸發連接 reset

對應 Issue #39718。當模型讓 Claude Code 執行一個會產生超大輸出的工具(例如 Write 一個幾十萬行的文件),底層 HTTP 連接持續 5 分鐘沒傳輸有效數據後會被 OS 主動 reset,但 Claude Code 沒有捕獲這個錯誤,於是在 UI 上繼續保持 spinner 狀態。這種卡住一般等待時間會精確卡在 5 分鐘左右。

根因 3:自動壓縮 thrashing

Claude Code 的上下文窗口快滿時會觸發 auto-compact。如果一個超大文件或工具輸出在壓縮後立刻又被讀回上下文,會反覆觸發壓縮,最終系統會停下來拋出 Autocompact is thrashing 提示。在拋出提示之前,UI 上看起來就像卡住。

根因 4:上下文使用率超過 80%

官方文檔明確指出,上下文超過 80% 後響應時間會顯著惡化,部分場景下表現爲長時間無響應。這種"僞卡住"的特徵是 token 計數仍在緩慢增長,但增長速度只有正常情況的幾分之一。

根因 5:settings 配置異常導致啓動期假死

對應 Issue #31049、#29652 等。例如 enableAllProjectMcpServers: true 配置加載大量本地 MCP server,或者 additionalDirectories 寫成了 //C:/ 這類異常路徑前綴,會讓 Claude Code 在啓動期卡死。這種卡住通常出現在打開新會話的最初幾秒。

根因 6:狀態行殘留(響應已完成但 UI 沒刷新)

對應 Issue #25539。在某些版本中,Claude 已經返回完整結果,但終端 UI 的 spinner 沒有清空,看起來還在轉。這時如果你按一個回車或者發一條消息,Claude 會立即開始新一輪工作——根本沒卡,只是 UI 撒了個謊。

排查時建議先看 token 計數是否在增長。如果你正在用 API易 apiyi.com 平臺中轉 Claude API,可以同時去平臺日誌裏查請求是否已經返回 200 OK,結合 Claude Code UI 的狀態做交叉驗證。

爲什麼發一條消息就能讓 Claude Code 復活

很多人發現一個"詭異"的工程奇蹟:Claude Code 卡了 3 分鐘,發一句"還在嗎"或者乾脆按個回車,它立刻接着把剛纔那段工作幹完。這個現象其實可以從協議層面解釋。

第一類情況是狀態行殘留(根因 6)。Claude 實際上已經完成了響應,只是 UI 沒有把 spinner 清除。這時候你發的新消息會直接被當作下一輪 prompt 處理,看起來像"復活",本質是接着推進。

第二類情況是流式響應卡頓(根因 1)。Claude Code 在接收到新輸入時,會主動關閉當前的 hang 狀態、清理半完成的請求,開始一段新的 HTTP 請求。新請求帶着完整的會話歷史發出去,模型從斷點附近繼續作答,所以表面上看就是"接着幹活了"。

第三類情況是 MCP server 或工具調用一直在等下游響應。新消息會被 Claude Code 路由成新的工具調用決策,間接繞開了卡住的那一次調用。

需要強調的是,發消息復活不是萬靈藥。當卡住是因爲底層進程已經處在不可恢復的等待狀態(例如根因 2 後期),發消息只能讓消息進入輸入隊列、但不會被處理,這時候必須 Ctrl+C 或者關閉終端。對於通過 API易 apiyi.com 平臺中轉的場景,發消息復活的成功率會更高,因爲中轉平臺一般會比官方端點更早把超時連接釋放掉。

Claude Code 卡住的 7 種恢復方法

不同根因對應不同的恢復手段。下表把最有效的 7 種方法按"侵入程度"由輕到重排列,便於決策。

claude-code-stuck-hanging-troubleshooting-guide-zh-hant 图示

方法 命令 適用根因 是否丟失上下文
發一條消息 直接輸入文本 根因 1 / 6
中斷當前操作 Ctrl+C 根因 1 / 2 / 3
自檢診斷 /doctor 任意,先診斷
壓縮上下文 /compact 根因 3 / 4 部分歷史變摘要
清空會話 /clear 根因 4 嚴重時
關閉終端再恢復 claude --resume 根因 1 / 2 嚴重時
強制結束進程 kill -9 <pid> 根因 1 / 2 不可恢復 當前輪丟失

實際操作順序建議是「先輕後重」。先按回車或隨便發條消息試試;不行就 Ctrl+C 取消當前輪;如果終端完全不響應,再關閉整個終端,然後用 claude --resume 把會話拉回來。

/doctor 是 Anthropic 官方推薦的兜底診斷命令。它會一次性檢查安裝、settings 文件、MCP server 列表、上下文使用率等關鍵指標,跑完之後通常能給出具體的修復建議。如果輸出裏報 Context: 87%,幾乎可以確定是根因 4,用 /compact 就能立即緩解。

對長任務場景,建議提前在工作流里加入定期 /compact,把上下文壓在 60% 以下。同時通過 API易 apiyi.com 平臺調用 Claude 時,可以爲 Claude Code 主進程和 MCP server 申請獨立配額,方便區分異常歸屬。

Claude Code 卡住預防的 5 條最佳實踐

排查只能事後救火,真正穩定的工作流靠預防。下面 5 條實踐基於多個 GitHub Issue 的根因總結,可以把卡住率壓到幾乎可以忽略不計。

claude-code-stuck-hanging-troubleshooting-guide-zh-hant 图示

第一條是 大文件分塊讀取。直接讀 1MB+ 文件幾乎一定會觸發上下文壓力。改成「先 ls -la 看大小,再用 Readoffset/limit 參數分段讀」的兩步走,能避免根因 4。

第二條是 複雜任務拆給 subagent。Claude Code 的 subagent 擁有獨立的上下文窗口,把生成大量文件、批量代碼改寫這類任務交給 subagent,可以從根因上避免主上下文被衝爆。

第三條是 關掉可疑 MCP server。每加一個 MCP server 都會增加啓動期假死風險。在 settings 裏只保留真正每天用的 MCP,其他全部關掉,可顯著降低根因 5。

第四條是 設置主模型超時與讀超時。社區一種成熟做法是把 STREAM_READ_TIMEOUT_MS 設爲 120 秒,在外層加個 watchdog 守護進程監控 JSONL 沒在增長就自動 kill 重啓。這針對根因 1 極其有效。

第五條是 使用穩定的 API 通路。跨境調用、家用寬帶、tmux 串接都會增加流式停滯概率。一種簡單做法是通過 API易 apiyi.com 這類聚合中轉平臺調用 Claude 系列模型,讓 TCP 長連接走穩定的中轉節點,能減少根因 1 出現頻次。

把這 5 條做到位的團隊,普遍反饋每週遇到卡住的次數能從 5-10 次降到 1 次以下,單次平均恢復時間也會從 5-10 分鐘壓到幾十秒。

常見問題

Q1: spinner 動詞不同代表 Claude 在幹不同的事嗎?

不代表。187 個默認動詞只是隨機抽取的擬人化文案,和 Claude 的真實狀態沒有任何對應關係。判斷狀態請看 token 計數和等待時長。

Q2: Ctrl+C 之後會丟上下文嗎?

不會。Ctrl+C 只取消當前沒完成的那一輪,整段會話依然保留。如果 Ctrl+C 不響應,可以再按一次或直接關閉終端,然後用 claude --resume 找回會話。

Q3: 國內調用 Claude Code 容易卡住嗎?

跨境網絡是流式中斷的主要誘因之一。建議通過 API易 apiyi.com 等聚合中轉平臺調用 Claude 模型,由穩定的中轉節點維護與 Anthropic 的長連接,國內開發者側的卡住概率會明顯下降。

Q4: 看到 `Autocompact is thrashing` 應該怎麼處理?

立即停止當前任務,使用 /compact keep only the plan and the diff 這種帶 focus 的壓縮命令,把大塊原始輸出從上下文裏清掉。如果還失敗,開新的會話或者把大文件讀取改成 subagent 模式。

Q5: 我可以自己改 spinner 動詞嗎?

可以。在 ~/.claude/settings.json 里加 spinnerVerbs 字段,模式可以是 defaultappendreplace,配合一個字符串數組。社區有 88 個主題、1900+ 詞的動詞包可以直接套用。

總結

Claude Code 卡住的本質,是流式協議、上下文管理、MCP 集成三個子系統在邊緣場景下的疊加問題。看懂狀態指示器的 4 個字段、記住 6 大根因和 7 種恢復手段,就能把"未知玄學"變成"已知故障"。

落地建議是把恢復方法做成肌肉記憶:先發消息、再 Ctrl+C、再 /doctor、最後關終端 claude --resume。配合穩定的 API 中轉和 5 條預防實踐,長期把上下文壓在 80% 以下、把大文件交給 subagent、通過 API易 apiyi.com 走穩定通路,絕大多數卡住場景都能在幾十秒內自我消化。


作者: APIYI 技術團隊
聯繫: 通過 API易 apiyi.com 獲取 Claude 全系列模型與 Claude Code 穩定中轉支持
更新時間: 2026-05-13

Similar Posts