使用Python內建的pdb和breakpoint()進行程式debug

Yanwei Liu
Mar 3, 2021

最近在Youtube上的拯救資工系學生的基本素養 — 使用 GDB 除錯基本教學這部影片中,學到了GDB這個工具的使用方式。於是我就在Google搜尋Python有沒有類似的工具

為何使用pdb和breakpoint()這樣的DEBUG工具

平常我們在解BUG的時候,往往會一直在程式裡面使用print()這個function來理解各個變數的內容,但是這樣的方式很費時間。使用pdb或breakpoint()這樣的工具,我們可以設定中斷點,當程式執行到中斷點時,可以自動停下來,使用相關的指令就能把已經執行過的變數印出來,方便進行DEBUG。

主要有兩種不同的型式:

#Python 3.7版本之前
import pdb;pdb.set_trace() #加在想要設定breakpoint的地方
#Python 3.7之後
breakpoint() #加在想要設定breakpoint的地方

可能會比較常用到的指令:

範例程式
# 當我們在程式碼加入這些breakpoint之後,當程式碼執行到breakpoint這一行時,就會看到(Pdb)出現,這時候,我們可以透過以下指令來了解程式碼的各個變數所表達的內容b— 新增breakpointp — 印出變數值 # p 變數名稱,例如 p varNamel — 印出目前所在 function/frame上下 11 行的程式碼ll — 印出目前所在 function/frame 的所有程式碼c — 持續執行程式碼直到遇到下一個中斷點unt — 持續執行程式直到某一行 #q — 離開 pdb

一些想法:

之前在寫PyTorch的時候,常常遇到一些BUG,每次想要DEBUG時,往往都需要重新執行程式,在「改程式<=>看執行結果」這個迴圈不斷循環,我覺得使用pdb或是breakpoint()這樣的方法,可以在未來處理BUG的時候,省下不少的時間。因為深度學習的程式有時候一旦執行下去,螢幕所output出來的結果很快就會迅速掃過,如果眼睛不夠銳利,可能很快就遺失了關鍵資訊,需要再度執行,浪費不少時間,也因此,這樣的DEBUG工具,就顯得非常重要。

如果程式執行時,程式內部有設定斷點,但想直接略過他,不中斷程式,可以怎麼做?

參考:https://stackoverflow.com/a/17820890

(Pdb) pdb.set_trace = lambda: None  # This replaces the set_trace() function!
(Pdb) continue
# No more breaks!

--

--