想法與洞見

探索 AI 優先開發、編碼護欄和可處置架構。

你的 main 分支壞掉了。你有 200 個 commit 要查。

Git bisect 把手動搜尋 commit 變成自動化的二元搜尋。以下說明如何找出引入 bug 的確切 commit,而不必一個個 checkout。

你的 CI 在 main 上是紅燈,但昨天還是綠燈。從那時到現在之間,某個 bug 悄悄潛入。你可以翻閱 200 個 commit,讀 diff 並猜測。你可以在 Slack 上發問,希望有人記得碰過相關程式碼。或者你可以讓 Git 幫你做這件事。 是針對 commit 歷史的二元搜尋工具。你標記一個 commit…

你的錯誤追蹤器知道它死在哪裡。這幫不了你重現它。

Stack traces 告訴你 crash 發生在哪裡,而不是什麼導致的。以下是一個擷取與重播模式,能把生產環境的 crash 變成你真正可以除錯的本機測試案例。

你確切知道生產環境在哪裡掛掉。Stack trace 指向 的第 147 行。例外是對 的 。你拉下程式碼,執行測試,全部通過。你用手動方式帶著範例 payload 命中端點,一切正常。 Bug 是真的。客戶正在觸發它。你卻無法在自己的機器上重現。 這就是根據錯誤報告進行除錯的標準體驗。Stack traces…

Symbolic Execution 找到了我 94% 測試覆蓋率都漏掉的整數溢位

你的單元測試只檢查特定輸入。Symbolic execution 檢查所有可能的輸入。以下是它的運作原理、成本,以及從哪裡開始。

你的測試套件有 94% 覆蓋率且零失敗。Symbolic execution engine 在三秒內就在你的程式碼中找到了一個 crash。 測試沒壞。覆蓋率指標沒有說謊。問題在於測試只驗證特定點上的行為。Symbolic execution 驗證的是整個輸入空間區域中的行為。如果 bug…

你的日誌正在外洩 PII,grep 救不了你

大多數團隊都是在客戶抱怨後才發現 PII 外洩。以下說明如何從資料進入到輸出的整個過程追蹤敏感資料,並附上今天就能使用的程式碼範例。

大多數團隊都是在客戶抱怨或合規稽核後才發現 PII 外洩。等到那時,資料早已穿過你的 ETL pipeline,掉進應用程式日誌,並被三種不同的可觀測性工具索引過了。 事後追查根本是考古學。你真正需要的是一個系統:在 PII…

你的 API 在生產環境掛掉,是因為 CI 測的是程式碼,不是 contracts

大多數 CI pipeline 抓得到語法錯誤和邏輯 bug,卻漏掉了真正搞垮生產環境的 API contract 破壞。以下是修復方法。

我團隊裡每一個進到生產環境的 API 破壞,都通過了 CI。全部。單元測試是綠燈。整合測試也過了。部署出去後,Slack 訊息才開始跳。 問題不在於我們沒測試,而是測錯了東西。大多數 CI pipeline 只驗證程式碼能不能跑,卻沒驗證 producer 和 consumer 之間的 API contract…

Crash Correlation 會說謊。以下是讓它指向真正 Bug 的方法。

統計除錯找到與當機相關的 predicates,但相關性不是檔案名稱與行號。以下是如何透過排序、過濾與三角測量,從相關分數走到真正的 bug 位置。

統計除錯給你的是一份排序過的 predicate 清單,而不是根本原因。你對每個分支與 null check 插樁,執行十萬次,然後演算法遞給你一個記分板。 的 重要性是 0.94。 的 也是 0.94。其中一個是 bug,另一個只是剛好在程式當機時總是為真。 高相關性代表 predicate 與當機同時發生。不代表…

Sentry 的 Seer 能讀懂你的 Traces。但這不代表它總是能找到根本原因。

Seer 攝取 trace tree、關聯錯誤與效能分析資料來診斷分散式問題。以下是它的實際運作方式、擅長的領域,以及仍然需要人類協助的地方。

前端拋出 500。stack trace指向一個 React 元件。真正的問題在三個服務之外,由一個洩漏的背景工作耗盡了資料庫連線池。 你可以點開 trace waterfall、關聯時間戳記、閱讀提交歷史。或者你可以把它交給 Sentry 的 Seer,一個由 LLM 驅動的除錯代理,它會讀取你的…

統計除錯本該終結 printf 除錯時代。大多數團隊卻從沒讓它跑起來。

統計除錯承諾透過將程式行為與失敗關聯來精確定位 bug。以下是這個想法為何從未從研究論文跨進生產系統的原因。

統計除錯本該終結 的時代。在程式碼中插入探針,收集數千次執行的追蹤資料,執行關聯分析,然後看著工具將每個分支與 null check 按照導致當機的可能性排序。它在 2000 年代中期的論文中運作得很漂亮。但在實務中,大多數嘗試過的團隊只得到雜訊、額外負擔,以及一個沒人信任的儀表板。…

你的測試通過了。你的資料仍然是錯的。

統計除錯將你的生產資料視為訊號,將 bug 視為異常。以下是如何在不新增任何單元測試的情況下,發現資料損毀、差一錯誤與無聲失敗的方法。

你的測試套件是全綠的。你的日誌靜悄悄。你的儀表板上沒有任何紅線。然而,3% 的使用者收到的發票總額是負數,或者你的推薦模型默默地將已刪除的產品排在最前面,或者你的聚合 pipeline 對某個時區的退款重複計算。 這些是資料 bug。它們不會拋出例外。不會讓 pod…

Metamorphic testing 發現了 147 個編譯器 bug 與一個自駕車缺陷。以下是它的運作原理。

Metamorphic testing 在 GCC、LLVM、Vulkan shader compiler 與 ADAS 模擬器中發現了真實的 bug。這篇文章用可執行的程式碼解釋這項技術,並說明它適合放在測試套件的哪個位置。

Metamorphic testing 在 GCC 與 LLVM 中發現了 147 個已確認的 bug,在汽車 OEM 使用的商業 ADAS 模擬器中發現了缺陷,並在一名行人被撞身亡的八天前,於一個自駕車感知系統中發現了致命缺陷。這項技術聽起來很學術,但這些 bug 可不是。 問題出在 oracle…