Community程式設計與開發github.com

nudarofficial/bug-hunter

透過基於證據的根本原因分析,調查並修復軟體錯誤。讀取堆疊追蹤、日誌和錯誤訊息;跨檔案追蹤邏輯、執行時期、並發性、安全性與效能缺陷;提出最小修正方案,並進行回歸審查與目標測試。當使用者回報錯誤、崩潰、例外、測試失敗、錯誤輸出、不穩定行為或效能降低,或要求除錯、尋找錯誤、審查程式碼時使用(適用於 Python、JavaScript、TypeScript、Java、C、C++、C#)。

bug-hunter 是什麼?

Bug Hunter 技能是一個專為開發者和 AI 代理設計的嚴謹軟體除錯工作流程。其主要用途是引導使用者逐步發現並修正程式碼缺陷,強調證據導向的根本原因分析,而非隨意猜測或症狀緩解。 該技能的核心價值在於其非妥協的規則:禁止偽造證據、必須區分「已確認」與「疑似」的發現、要求修正原因而非症狀、限制編輯範圍僅於修正指令下、並要求事後清理。這些規則確保了分析過程的科學性和結果的可靠性。 技能提供了一個結構化的九步驟工作流程,從定義錯誤、收集證據、重現問題,到找出根本原因、設計最小修正、進行回歸審查、添加測試,最後生成結構化報告。它還針對不同情境(如收到堆疊追蹤、要求程式碼審查、處理不穩定測試、效能問題或安全性審查)提供了具體的處理指引。 此技能廣泛支援多種主流程式語言,包括 Python、JavaScript、TypeScript、Java、C、C++、C#、Rust、PHP、Ruby 和 SQL,並整合了針對語言陷阱、安全性缺陷和效能問題的專門參考文件。總結來說,Bug Hunter 是一個專業、系統化的除錯框架,能顯著提升程式碼缺陷分析與修復的效率與正確性。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/nudarofficial/bug-hunter/tree/HEAD/bug-hunter

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Bug Hunter

找出缺陷的根本原因,以最小且健全的變更進行修正,並準確回報已驗證與未驗證的內容。

不可妥協的規則

  1. 絕不偽造證據。 請勿捏造堆疊追蹤、錯誤訊息、日誌行、測試結果、重現步驟、基準測試數字或 CVE 識別碼。如果某些內容未執行或未觀察到,請明確說明。
  2. 區分已確認與疑似。 只有當發現基於觀察到的失敗、已重現的執行或明確的程式碼路徑時,該發現才算 已確認。其他所有情況均屬於 潛在風險 或 需要驗證。
  3. 修正原因,而非症狀。 除非分析顯示「try/except」包裝錯誤、添加 null 檢查或增加逾時是實際的根本原因,否則不要這麼做。
  4. 保持範圍。 請勿重構、重新格式化、重新命名或「改進」不相關的程式碼。未經使用者明確許可,請勿刪除資料、重寫 git 歷史、變更依賴項或執行破壞性命令。
  5. 標註假設。 當執行時期版本、配置、輸入資料或呼叫者行為未知時,請在依賴於該假設的結論旁陳述該假設。
  6. 僅在被要求修正時才編輯。 「修正這個」/「讓測試通過」→ 套用修正。「尋找錯誤」/「審查」/「為什麼…」→ 回報發現並提出建議修正,除非使用者要求編輯,否則保持程式碼不變。
  7. 事後清理。 將臨時的重現除錯腳本放置在臨時位置(或之後從專案中刪除),並在報告中提及它們。

工作流程

對於任何非平凡的 Bug,請複製此檢查清單並追蹤進度:

Bug 獵殺進度:
- [ ] 1. 定義 Bug(觀察到的行為 vs 預期的行為)
- [ ] 2. 收集證據(程式碼、追蹤、日誌、輸入、版本)
- [ ] 3. 重現或追蹤失敗
- [ ] 4. 形成並測試假設;找出根本原因
- [ ] 5. 分類發現(已確認 / 潛在 / 已排除)
- [ ] 6. 設計最小修正
- [ ] 7. 審查修正以確保無回歸
- [ ] 8. 添加或建議測試;如獲允許則執行它們
- [ ] 9. 回報結果與驗證狀態

1. 定義 Bug

分別用一句話描述觀察到的行為、預期的行為和觸發條件(輸入、環境、頻率)。如果預期行為不明確,請在修改程式碼前提問。對於「在此程式碼中尋找錯誤」且沒有報告的請求,請根據名稱、文件、測試和呼叫者推斷預期行為,並說明該推斷。

2. 收集證據

  • 閱讀失敗的程式碼以及其呼叫者、被呼叫者和它使用的資料。Bug 通常存在於距離其表面現象一跳之遙的位置。
  • 對於堆疊追蹤,找到專案程式碼(而非函式庫程式碼)中最深的幀,以及狀態首次出錯的幀。請參閱 reference/stack-traces.md。
  • 當語言/執行時期版本、框架和配置會影響語義時(例如 Go < 1.22 的迴圈變數、Python 2 與 3 的除法、JavaScript 的 ==),請註明它們。
  • 如果版本控制可用,檢查最近的變更(git log -p -- <file>、git blame、用於回歸問題的 git bisect)。

3. 重現或追蹤

按以下順序優先選擇:

  1. 執行現有的失敗測試或命令。
  2. 撰寫能觸發失敗的最小腳本或測試。
  3. 如果無法執行(無權限、缺少服務、無工具鏈),則手動追蹤路徑:列出每個步驟以及相關變數的具體值。將結果標記為 「已追蹤,未執行」。

切勿回報未實際執行的重現。

4. 找出根本原因

  • 提出一個能解釋所有觀察到的症狀(而不僅僅是最後一個)的假設。
  • 測試它:添加有針對性的斷言或日誌,縮小輸入範圍,或進行二分搜尋。捨棄證據反駁的假設,並說明原因。
  • 不斷追問「為什麼」,直到達到程式碼、配置、資料或合約中的缺陷——而非症狀的複述。「變數是 None」是症狀;「快取在未命中時返回 None,而呼叫者假設命中」才是原因。
  • 檢查相同的缺陷模式是否存在於其他地方(grep 搜尋相同的呼叫、慣用語或複製的區塊)。將其他出現的情況作為單獨的發現進行報告。
  • 如果你發現第二個缺陷:僅當它屬於所報告症狀的一部分時才一併修正(並說明);否則報告它並保持不變。

特定語言的陷阱:reference/language-pitfalls.md。 安全性缺陷:reference/security.md。 效能缺陷:reference/performance.md。

5. 分類發現

狀態含義
已確認已重現、在提供的追蹤/日誌中觀察到,或確定性程式碼路徑證明了它。
潛在風險在未顯示的條件下(特定輸入、負載、配置)是合理的。請說明這些條件。
需要驗證取決於你沒有的資訊。請說明什麼可以確定它。
已排除你檢查過並拒絕的假設。當它能節省使用者時間時,請包含它。

始終說明如何確定一個 已確認 的發現:已重現(你執行過)、已觀察到(在使用者的追蹤或日誌中),或已追蹤,未執行(讀取了確定性程式碼路徑但未執行)。

根據影響分配嚴重性,而不是根據 Bug 的有趣程度。當呼叫者不可用時,根據最可能的用法評級,並說明該假設:

嚴重性典型影響
重大資料遺失或損毀、遠端程式碼執行、身分驗證繞過、影響所有使用者的核心路徑崩潰
高常見路徑上的錯誤結果、可被利用的注入、在合理輸入下崩潰、耗盡服務的資源洩漏
中邊緣案例的錯誤結果、負載下的效能下降、缺少驗證(影響範圍有限)
低外觀問題、誤導性訊息、輕微效率低下、具有合理未來失敗可能的程式碼氣味

6. 設計最小修正

  • 變更最少的行數以消除根本原因。保持現有風格、命名和公開介面。
  • 如果適當的修正很大(結構變更、API 變更、架構變更),請提出方案,並在有用時提出清楚標記的短期緩解措施。
  • 當有多個合理的修正時,推薦一個並用一句話說明權衡取捨。
  • 以統一的 diff 或完整的修正後函數形式展示修正——以對變更大小而言更清晰的方式為準。

7. 審查以確保無回歸

在提出修正前,請檢查:

  • 已變更函數的每個呼叫者仍然獲得其所依賴的行為(返回類型、None/null 處理、引發的例外、排序)。
  • 邊界輸入:空值、單一元素、最大尺寸、負數、零、Unicode、None/null/undefined。
  • 並發性:共享狀態、排序、取消、重試。
  • 錯誤路徑仍能釋放資源(檔案、鎖、連線、事務)。
  • 安全態勢不變或改善(無新的注入、未停用驗證)。
  • 效能沒有漸進式惡化。
  • 任何可觀察行為的變更(返回值、例外、可變性與複製、API 回應)都明確指出,並說明需要適應的呼叫者。

8. 測試

  • 添加一個在修正前失敗、修正後通過的回歸測試。根據行為命名,而非工單編號。在可行時,透過對未修正的程式碼執行測試來展示失敗(在編輯前,或透過 git stash);否則說明「未展示修正前的失敗」。
  • 使用專案現有的測試框架和慣例。不要添加新的框架。如果專案沒有測試框架,則將測試作為可使用語言標準工具(python -m unittest、node:test、go test)執行的純斷言給出,並說明未找到框架。
  • 僅在環境允許且使用者未禁止時才執行測試。報告確切的命令和實際結果;如果未執行,請說明「未執行」並給出命令。

9. 報告

根據發現的內容選擇格式:

  • 單一發現 → 使用下面的簡潔格式。
  • 多項發現,或審查 → 使用 reference/report-template.md 中的完整結構,並以發現表格開頭;刪除不適用的章節。
  • 沒有可用證據 → 請參閱請求類型下的「證據不足」。

簡潔格式:

**根本原因:** <一兩句話>
**狀態:** 已確認 — 以 `<command>` 重現 / 在 <追蹤> 中觀察到 / 已追蹤,未執行 | 潛在風險 | 需要驗證
**修正:** <diff 或修正後的程式碼>
**回歸檢查:** <考慮了什麼>
**測試:** <添加的測試名稱> — <通過 / 失敗 / 未執行,以及命令>
**未驗證:** <任何遺留的問題>

請求類型

「這裡有一個錯誤 / 堆疊追蹤」 → 從追蹤開始執行步驟 1–9。

證據不足(提到了崩潰、追蹤或日誌但未提供;或沒有可用的程式碼)→ 請勿猜測追蹤或修正。清楚地說明缺少什麼,並要求提供:確切的錯誤輸出(完整、未修剪)、相關程式碼及其呼叫者、執行時期/語言版本,以及何時發生(頻率、負載、最近的變更)。你可以僅作為清楚標記的假設列出該語言的可能原因,以便檢查。有關各語言的追蹤收集技巧(例如 GOTRACEBACK=all、RUST_BACKTRACE=1、-race),請參閱 reference/stack-traces.md。

「在此檔案中尋找錯誤 / 審查此程式碼」 → 閱讀整個單元及其介面,然後按嚴重性排序列出發現。每個發現:位置(file:line)、狀態、嚴重性、證據、建議的修正。除非要求,否則不要編輯程式碼。不要用風格小問題填充列表;將次要項目歸入「低優先級注意事項」下或省略它們。

「這個測試不穩定」 → 尋找時間、隨機性、排序(dict/set/hash 迭代、並行測試)、測試間的共享狀態、網路和未等待的非同步工作。透過控制它們來證明來源(固定種子、凍結時鐘、隔離狀態)。

「它變慢了」 → 在宣稱前進行測量;請參閱 reference/performance.md。切勿引用你未測量過的加速。

「這安全嗎?」 → 遵循 reference/security.md。僅報告具有具體攻擊路徑或明顯不安全模式的問題;將其餘的標記為強化建議。

實例

請參閱 reference/examples.md 以獲取涵蓋 Python、JavaScript、TypeScript、Java、Go、C、C++、C#、Rust、PHP、Ruby 和 SQL 的完整 Bug 報告,展示已確認的發現、潛在風險和最小修正。

相關技能