除錯
昂貴的錯誤是修復第一個看似合理的原因。花前面幾分鐘來縮小範圍,而不是打補丁。
方法
- 精確捕捉失敗資訊。 完整的錯誤文字、堆疊追蹤、退出碼、時間戳記、請求 ID、執行的命令。將其放入程式碼區塊。轉述的錯誤會遺失關鍵的記號。
- 重現它。 找到最小、最快的方式來按需觸發它。如果你無法重現,請說明並根據日誌工作;不要默默地猜測。
- 確定什麼改變了。
git log --since、最近的上線、依賴項升級、配置或 IAM 更改、供應商升級、憑證過期。大多數事件都是變更引起的。 - 形成兩三個假設 並根據可能性以及驗證成本對其進行排序。在測試之前把它們寫下來。
- 一次測試一個假設,使用一個只有當該假設成立時才有意義的更改。撤銷沒有幫助的更改;不要累積投機性的編輯。
- 修復原因。 然後撰寫一個沒有該修復就會失敗的回歸測試(請參閱
tdd技能)。 - 以與你重現相同的方式進行驗證,並執行更廣泛的測試套件。
依症狀查看何處
| 症狀 | 優先檢查 |
|---|---|
| 本地正常,CI 失敗 | 環境變數、機密、作業系統/架構、node/python 版本、快取依賴項、時區、工作目錄 |
| 間歇性/不穩定 | 測試之間的共享狀態、時間、順序、網路、掩蓋真實失敗的重試機制 |
| AWS AccessDenied | 哪個主體 (aws sts get-caller-identity)、資源政策 vs 身份政策、SCPs、權限邊界、KMS 金鑰政策、區域 |
| Lambda 超時 / 冷啟動 | VPC 附加元件、DNS、處理器外的初始化、記憶體大小、X-Ray 中的下游延遲 |
| Terraform 錯誤 | 供應商版本、狀態漂移 (terraform plan -refresh-only)、-target 殘留、鎖定檔案 |
| Kubernetes Pod 未就緒 | kubectl describe pod、事件、探針、資源限制、映像拉取、機密/ConfigMap 掛載 |
| 部署後 5xx | 比較先前的映像檔/提交、健康檢查路徑、環境/配置差異、資料庫遷移順序 |
規則
- 在閱讀程式碼之前先閱讀日誌。日誌告訴你位置;程式碼告訴你原因。
- 如果需要,加入暫用日誌,並在提交前將其移除。
- 永遠不要透過擴大權限、停用 TLS 驗證、捕獲並吞嚥例外,或在不了解重試內容的情況下新增重試來「修復」。
- 當你修復它時,用一段話寫下:原因、為何未被捕獲、下次如何防止。這段話應放在 PR 或提交訊息中。