4.3 · 調試技巧
目標: 系統隔離 bug。
調試心態
- 復現 —— 找一個穩定觸發 bug 的輸入。
- 隔離 —— 縮到涉及代碼的最小部分。
- 假設 —— 猜原因。
- 測假設 —— 改一處再跑。
- 修 —— 最小改動。
- 加測試 —— 防迴歸。
技術
1 · print 調試
在可疑處插入 print 顯示變數值。
python
def average(nums):
print("DEBUG: nums =", nums)
total = sum(nums)
print("DEBUG: total =", total)
return total / len(nums)1
2
3
4
5
2
3
4
5
低科技但有效。修好後刪掉。
2 · 用 IDE 調試器
設斷點、逐行執行、檢查變數。Thonny、VS Code、PyCharm 都支援。
3 · 紙上追蹤表
bug 是邏輯性的時,用筆紙過代碼(模組 D 第 2.5 節)。
4 · 二分法(二分搜 bug)
100 行代碼重構後出 bug,註釋掉新加代碼的一半再測。在剩餘的一半上重複。
5 · 小黃鴨調試
對無生命物體(或朋友)一行行解釋你的程式碼。説出口的過程常露出 bug。
6 · 與工作版本對比
用了 git,跑 git diff 看程序上次能跑後改了什麼。
實例
python
def factorial(n):
result = 1
for i in range(n): # BUG:應為 range(1, n+1)
result *= i # i 從 0 起 → result 變 0!
return result
print(factorial(5)) # 0,不是 1201
2
3
4
5
6
7
2
3
4
5
6
7
調試步驟:
- 復現 ——
factorial(5)返回 0。 - 隔離 —— 只有一個迴圈和一個乘法。
- 假設 —— 也許範圍錯。
- 測 —— 在迴圈里加
print(i, result):0 0 1 0 2 0 3 0 4 01
2
3
4
5 - 啊哈!
i從 0 起,乘 0 → 永遠 0。 - 修 ——
range(1, n+1)。
比較不同解法
課程鼓勵學生比較同一問題的不同解法在:
- 步數
- 記憶體使用
- 可讀性
養成「有沒有更好的方法?」的習慣。
學生常見錯誤
- 一次改太多 —— 分不清哪修起了作用。
- 隨機改(「試試看…」)而非按假設。
- 最終提交前忘刪 debug
print。 - 不寫抓 bug 的測試防迴歸。
考試式題目
題(5 分): 程序本該印 1+2+…+n 的和,但
n=5時印 10 不是 15。(a) 識別最可能的錯誤類型。 (b) 描述能幫忙找原因的三種調試技術。
參考答案:
(a) 邏輯錯誤 —— 程序跑但和錯。
(b) 三種技術:
- 在紙上做追蹤表,對 n=5 逐輪過並跟期望對比。
- Print 調試 —— 在迴圈里加
print(i, total)看執行總和如何演變。 - 用 IDE 調試器步進,在迴圈設斷點,每輪檢查變數。
關鍵要點
- 系統調試:復現 → 隔離 → 假設 → 測 → 修 → 再測。
- 多種技術可用;先用最便宜的。
- 沒測試的修復是早晚回來的 bug。
模組 D 總結
自測:
- 能手工追蹤 15 行偽程式碼嗎?
- 能在 Python 裏從零實現線性查找、min/max/avg 嗎?
- 能列 3 種錯誤類型並舉例嗎?
- 能描述 3 種調試技術嗎?
➡️ 下一模組:模組 E · 社會影響