差異除錯

2023 年 12 月 4 日

回歸錯誤是軟體功能中新出現的錯誤,而這些功能已經存在一段時間了。在追蹤這些錯誤時,通常有價值的做法是找出軟體中哪項變更導致這些錯誤出現。查看該變更可以提供寶貴的線索,說明錯誤在哪裡以及如何消除它。這種調查形式沒有廣為人知的術語,但我稱之為差異除錯。

差異除錯僅在我們將程式碼放入版本控制時才有效,但幸運的是,這在現今已成為常態。但還有一些事情需要讓它有效運作。我們需要可重複建置,以便我們可以輕鬆執行軟體的舊版本。由於高頻率整合,因此擁有小提交會很有幫助。這樣一來,當我們找到有問題的提交時,我們可以更輕鬆地縮小發生情況的範圍。

若要找出產生錯誤的提交,我們首先找到沒有錯誤的任何過去版本。將其標記為最後良好版本,並將目前版本標記為最早不良。然後找出介於兩者之間的提交,看看錯誤是否在那裡。如果是,則此提交會變成最早不良,否則它會變成最後良好。重複這個過程(這是「半區間」或「二元」搜尋),直到我們找到有問題的提交。

如果我們使用 git,則git bisect指令會為我們自動執行大部分的步驟。如果我們可以撰寫一個測試來顯示錯誤的存在,那麼 git bisect 也可以使用它,自動化找出有問題提交的整個過程。

我經常發現差異除錯在程式設計階段很有用。如果我有執行需要幾分鐘的慢速測試,我可能會編寫半小時的程式,只執行最相關測試的子集。只要我在每次綠色測試執行後提交,如果那些較慢的測試之一失敗,我可以使用差異除錯。這是極其頻繁提交的價值,即使它們非常小,以至於我覺得最好將它們壓縮以供長期歷史記錄。有些 IDE 會自動保留比版本控制提交更細緻的本地歷史記錄,讓這項工作變得更容易。

修訂

我最初在 2004-06-01 發布此頁面。其原始形式比較像是休閒體驗報告。我在 2023-12-04 重新撰寫,使其更像是該術語的定義。差異除錯並非業界廣泛接受的術語,但我尚未看到另一個通常用來描述它的術語。