Skip to content
💻程式#114入門金字塔 · 做
工程師Claude CodeCodexClaude.ai#除錯#錯誤分析#問題排查

Debug 根因分析助理(通用)

用途

系統性分析任何語言的錯誤現象,輸出三個根因假設(機率排序)、對應的驗證步驟與修復方案,讓你有結構地縮小問題範圍而不是亂槍打鳥。

何時用

  • 適合:遇到無法快速定位的 bug、不熟悉的錯誤訊息,或同一個問題反覆出現卻找不到根本原因時,語言不限。
  • 不要用:專門的 Python 根因分析用「Python 除錯版」更精準;問題已經定位只是不知道怎麼改的話,直接問怎麼修比跑完整分析快。

Prompt

text
請幫我系統性分析這個 bug 的根本原因。

問題現象:{{描述你觀察到的異常,例:每隔約 2 小時後台 job 就掛掉}}
錯誤訊息:{{完整的錯誤訊息或 log 片段,沒有的話填「無」}}
相關程式碼:{{觸發錯誤的程式碼片段,或說明出錯的流程}}
已嘗試的解法:{{你試過哪些方法沒效,填「無」表示還沒嘗試}}
執行環境:{{語言版本、OS、部署環境,例:Node 20 / Ubuntu 22.04 / Docker}}

輸出格式:
**根因假設(3 個,依機率高→低排序)**
1. [假設1] — 機率理由
2. [假設2] — 機率理由
3. [假設3] — 機率理由

**驗證步驟(對應上面三個假設)**
- 驗證假設1:[具體指令或操作]
- 驗證假設2:[具體指令或操作]
- 驗證假設3:[具體指令或操作]

**對應修復方案**
- 若假設1成立:[修復方向]
- 若假設2成立:[修復方向]
- 若假設3成立:[修復方向]

**預防措施**(修好後怎麼讓同類問題不再發生)

範例 / 變體

  • 填好變數:問題現象填 每隔約 2 小時後台 job 就掛掉、錯誤訊息填 OOMKilled、執行環境填 Python 3.11 / Kubernetes 1.29、已嘗試解法填 調大 memory limit 沒有用
  • 變體(只要最高機率假設):在輸出格式前加「只輸出最高機率的假設與驗證步驟,其餘略過」,適合時間緊時的快速切入。
  • 變體(加 timeline 分析):在問題現象後加「這個錯誤從 2026-06-01 開始出現,之前都正常,請特別分析那天可能的變更因素」。

🎯 範例輸出(實測)

Claude.ai 跑這句、問題現象填「每隔約 2 小時後台 job 就掛掉」、錯誤訊息填「OOMKilled」、執行環境填「Python 3.11 / Kubernetes 1.29」、已嘗試解法填「調大 memory limit 沒有用」的結果:

點開看 AI 實際輸出

根因假設(3 個,依機率高→低排序)

  1. [記憶體洩漏] — 機率高(70%) Job 每 2 小時規律觸發 OOM,且調大 limit 無效,高度符合記憶體持續洩漏的特徵:大物件(DataFrame、圖片 buffer、DB 連線)在每輪迴圈後沒有正確釋放,最終撐破 limit。

  2. [外部資料量爆炸] — 機率中(20%) 每 2 小時拉取的資料量可能在特定時間點暴增(例:每日交易高峰、批次報表),一次性載入全量資料至記憶體造成 OOM。

  3. [子程序/執行緒殭屍堆積] — 機率低(10%) 若 Job 使用 multiprocessing 或呼叫外部程式,子程序未正確 join/terminate 可能導致記憶體不斷被佔用。

驗證步驟(對應上面三個假設)

  • 驗證假設1:在 Job 的主迴圈裡加 import tracemalloc; tracemalloc.start(),每輪結束時輸出 top-10 記憶體佔用物件,觀察是否有某個物件數量持續增長
  • 驗證假設2:在 Job 開始時 log 本輪資料筆數 + 原始資料大小(bytes),比對 OOM 前的最後幾筆 log 是否有特別大的批次
  • 驗證假設3:執行 kubectl exec <pod> -- ps aux | grep defunct 查看是否有殭屍子程序

對應修復方案

  • 若假設1成立:在迴圈末尾加 del df; gc.collect(),大型物件改用 generator 分批處理而非一次載入
  • 若假設2成立:改用分頁或 chunking 拉資料,每批 10,000 筆,處理完釋放再拉下一批
  • 若假設3成立:確保 multiprocessing.Process 呼叫後有對應的 p.join(),或改用 concurrent.futures.ProcessPoolExecutor

預防措施

  • 在 Kubernetes Deployment 設定 memory requestlimit 相等(避免 Burstable QoS 造成調度不穩)
  • 加 Prometheus process_resident_memory_bytes 監控指標,設定記憶體成長超過 80% limit 即告警,不用等 OOMKilled

💡 實測心得:「已嘗試的解法:調大 memory limit 沒有用」這行輸入很關鍵——AI 用它排除了「limit 設太小」這個最常見假設,才能把焦點放在真正的洩漏問題上。填越詳細已嘗試的步驟,AI 的假設就越精準。

延伸

重點來了:「三個假設機率排序」這個格式的價值在於強迫 AI 承認不確定性,而不是給你一個假裝確定的答案。機率低的假設也要列出來,因為有時候最奇怪的假設才是真相。驗證步驟如果你跑完後發現假設1不成立,把結果回饋給 AI 繼續追蹤,通常兩三輪就能定位。

依場景分類 · 一鍵複製 · 持續擴充