用自動化窮舉搜尋找出問題#

當你面對許多可能的離散原因且無法輕易判斷哪個是罪魁禍首時,可以撰寫小型程式或腳本來窮舉搜尋所有可能造成問題的情況。這在人工測試不切實際但電腦可以逐一嘗試的場景特別有效。

實際案例:PATH 中的延遲#

書中舉了一個經典案例:升級後 which 指令執行變得異常緩慢。將長長的 PATH 改為 /usr/bin 就消除了延遲,但 PATH 中有 26 個元素,哪個才是問題所在?

解決方式是寫一個 shell script 測量每個 PATH 元素的搜尋時間:

# Obtain path
echo $PATH |
# Split the :-separated path into separate lines
sed 's/:/\n/g' |
# For each line (path element)
while read path ; do
  # Display elapsed time for searching through it
  PATH=$path:/usr/bin time -f "%e $path" which ls >/dev/null
done

結果立刻顯示,一個只有單一斜線 / 的元素花了 4.55 秒,其他元素都只要 0.01 秒。追蹤 which 指令的執行後發現,它會在每個路徑元素後加上斜線,而在 Windows 上以雙斜線開頭的路徑會觸發網路磁碟探索程序。

其他自動化搜尋方式#

如果無法用腳本驅動外部程式,可以在程式中嵌入小型搜尋程序

  • 用演算法產生所有可能的案例(例如遍歷所有可能的值)
  • 從外部檔案讀取案例
  • 從現有的 execution logs 中擷取案例

動態分析工具#

也有專門的工具可以自動偵測 API 違規、memory buffer overflow 和 race condition(參見 Item 59 和 Item 62)。這些工具可能讓原本幾秒鐘的測試需要數十分鐘,但省下的除錯時間絕對值得。

重點回顧#

  • 自動化對失敗原因的窮舉搜尋——電腦時間便宜,你的時間昂貴