測試與除錯練習題 (Practice - Testing and Debugging)


Question 1 - 併發 bug 分類 [recall]

與併發直接相關的錯誤可分為哪兩大類?各自再細分為哪些子類型?


Question 2 - 死結 vs 活結 [recall]

死結與活結的表現都可能是「程式停止回應」,兩者的本質差異與快速判別指標是什麼?


Question 3 - 破壞不變量的表現 [recall]

「破壞不變量」這類競爭條件錯誤有哪三種典型表現?


Question 4 - 蠻力測試的缺點 [recall]

蠻力測試(壓力測試)跑了十億次都通過,為什麼仍可能誤導你?


Question 5 - 組合模擬測試 [recall]

組合模擬測試 (combination simulation) 的原理是什麼?為什麼不適合拿來測整個應用?


Question 6 - 測試程式碼的四個組成 [recall]

建構多執行緒測試程式碼時,每個測試可拆成哪四個部分?


Question 7 - 單核/多核定位 [application]

你的程式在多執行緒模式下偶爾輸出錯誤結果。把它放到單核機器上跑(仍是多執行緒)問題消失;改成單執行緒跑也正常。你會如何推論,下一步查什麼?


Question 8 - 設計「同時」測試 [application]

要測試「一執行緒對空佇列 push、同時另一執行緒 pop」,如何確保兩個操作真的並發發生,而不是 push 早就跑完了?


Question 9 - 三種測試技術取捨 [analysis]

比較蠻力測試、組合模擬測試與專用庫檢測:覆蓋徹底度、成本、適用範圍各如何?若你要驗證一個新寫的 lock-free 佇列與一整個伺服器應用,分別選哪種?


Question 10 - 阻塞型 vs 競爭型的除錯策略 [analysis]

阻塞型 bug(死結/活結)與競爭型 bug(資料競爭/破壞不變量)在症狀與除錯手段上有何本質差異?為什麼後者被稱為「共享記憶體的詛咒」?