debugging

5 posts

你的 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…

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

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

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

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

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

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

當你不懂 mutant 改了什麼時,如何殺掉一個存活下來的 mutant

Mutation testing 發現了一個 survivor,但你完全不知道這個 mutation 到底做了什麼。這裡有一個逐步方法,讓你在還沒理解 mutant 之前就能寫出正確的 test。

你的 mutation testing 報告充滿了 survivors,其中至少有一個讓你完全摸不著頭緒。 工具說它在第 47 行把 翻成了 ,或是把整個 conditional block 替換成 ,或是 mutate 了一個你根本不知道正在被測試的 string literal。你把 diff…