讓問題更加顯眼#
讓問題的表現更加突出,可以提升除錯效率。你可以透過操縱軟體本身、輸入資料或執行環境來達成。
務必在版本控制的獨立分支上進行所有修改,確保能輕鬆還原,不會誤入 production code。
大刀闊斧式手術(Drastic Surgery)#
當軟體拒絕按預期行為運作時(例如某些複雜條件看似滿足,但資料庫記錄就是不出現),可以透過強制修改條件來縮小問題範圍。
例如 Apache HTTP Server 中處理 signed certificate timestamps (SCTs) 的程式碼:
if (fields.time > apr_time_now() || 1) {將條件改為永遠為真,就能判定問題是在條件判斷、測試資料,還是後續處理邏輯中。
其他技巧包括:
- 在方法開頭加入
return true或return false - 用
if (0)跳過某段程式碼的執行
放大效果使其可見#
當你試圖除錯一個幾乎看不到的效果時,可以暫時修改程式碼來放大它:
- 遊戲中角色的微小能力提升?放大倍數使其顯而易見
- CAD 程式中地震對建築的位移計算?將結構位移放大 1,000 倍
修改執行環境#
當軟體的失敗取決於外部因素時,可以修改環境讓它更快或更頻繁地失敗:
- 使用 load test 或 stress test 工具(如 Apache JMeter)將應用逼入你懷疑出問題的區域
- 增加執行緒數量到遠超合理範圍,幫助重現 deadlocks 和 race conditions
- 同時執行消耗 memory、CPU、network、disk 的程式來製造資源競爭
- 將資料儲存在小容量 USB 隨身碟上,觀察磁碟滿時的行為
Fuzzing#
Fuzzing 是一種用隨機產生或隨機擾動的輸入來測試程式的方法。目標是增加觸發故障的資料模式出現的機率。找到有問題的資料後,就能用它來除錯。可以使用
zzuf等工具來執行 fuzzing。
重點回顧#
- 強制執行可疑的程式碼路徑
- 放大某些效果的幅度,使其更易於觀察
- 對軟體施加壓力,迫使它離開舒適區
- 所有修改都在臨時的版本控制分支上進行