Python 偵錯程式 (pdb)
在軟體開發術語中,“除錯”一詞通常用於指定位並糾正程式中錯誤的過程。Python 的標準庫包含 pdb 模組,它是一組用於除錯 Python 程式的實用程式。
除錯功能在 Pdb 類中定義。該模組在內部使用 bdb 和 cmd 模組。
pdb 模組具有非常方便的命令列介面。它在 Python 指令碼執行時使用 –m 開關匯入。
python –m pdb script.py
為了進一步瞭解偵錯程式的工作原理,讓我們首先編寫一個 Python 模組 (fact.py) 如下所示:
def fact(x):
f = 1
for i in range(1,x+1):
print (i)
f = f * i
return f
if __name__=="__main__":
print ("factorial of 3=",fact(3))從命令列開始除錯此模組。在這種情況下,程式碼執行會在第一行停止,並在其左側顯示箭頭 (->),並生成偵錯程式提示符 (Pdb)。
C:\python36>python -m pdb fact.py > c:\python36\fact.py(1)<module>() -> def fact(x): (Pdb)
要檢視所有偵錯程式命令的列表,請在偵錯程式提示符前鍵入“help”。要了解有關任何命令的更多資訊,請使用“help <command>”語法。

list 命令列出整個程式碼,並在程式已停止的行左側使用 -> 符號。
(Pdb) list
1 -> def fact(x):
2 f = 1
3 for i in range(1,x+1):
4 print (i)
5 f = f * i
6 return f
7 if __name__=="__main__":
8 print ("factorial of 3 = ", fact(3))要逐行遍歷程式,請使用 step 或 next 命令。
(Pdb) step
> c:\python36\fact.py(7)<module>()
-> if __name__=="__main__":
(Pdb) next
> c:\python36\fact.py(8)<module>()
-> print ("factorial of 3 = ", fact(3))
(Pdb) next
1
2
3
factorial of 3= 6
--Return--
> c:\python36\fact.py(8)<module>()->None
-> print ("factorial of 3 = ", fact(3))step 和 next 命令之間的主要區別在於,step 命令會導致程式在函式內停止,而 next 命令則執行被呼叫的函式並在其之後停止。
C:\python36>python -m pdb fact.py
> c:\python36\fact.py(1)<module>()
-> def fact(x):
(Pdb) s
> c:\python36\fact.py(7)<module>()
-> if __name__=="__main__":
(Pdb) n
> c:\python36\fact.py(8)<module>()
-> print ("factorial of 3=",fact(3))
(Pdb) s
--Call--
> c:\python36\fact.py(1)fact()
-> def fact(x):
(Pdb) n
> c:\python36\fact.py(2)fact()
-> f = 1
(Pdb) n
> c:\python36\fact.py(3)fact()
-> for i in range(1,x+1):
(Pdb) n
> c:\python36\fact.py(4)fact()
-> print (i)
(Pdb) n
1
> c:\python36\fact.py(5)fact()
-> f = f * i
(Pdb) n
> c:\python36\fact.py(3)fact()
-> for i in range(1, x + 1):
(Pdb) n
> c:\python36\fact.py(4)fact()
-> print (i)
(Pdb) f,i
(1, 2)
(Pdb)step 命令還在程式遇到函式呼叫時顯示 --call-- 指示,並在函式結束時顯示 --return---。在任何時候,我們都可以透過只輸入變數名來檢查某個變數的值。
您可以使用 break 命令在程式中設定斷點。必須給出行號(應在其中設定斷點)。例如,“break 5”將在當前程式的第 5 行設定斷點。
(Pdb) list
2 f = 1
3 for i in range(1, x + 1):
4 print (i)
5 f = f * i
6 return f
7 -> if __name__=="__main__":
8 print ("factorial of 3=",fact(3))
[EOF]
(Pdb) break 5
Breakpoint 1 at c:\python36\fact.py:5
(Pdb) continue
1
> c:\python36\fact.py(5)fact()
-> f = f * i
(Pdb) break
Num Type Disp Enb Where
1 breakpoint keep yes at c:\python36\fact.py:5
breakpoint already hit 1 time
(Pdb) continue
2
> c:\python36\fact.py(5)fact()
-> f = f * i
(Pdb) b
Num Type Disp Enb Where
1 breakpoint keep yes at c:\python36\fact.py:5
breakpoint already hit 2 times發出“continue”命令後,程式執行將繼續進行,直到遇到斷點。要顯示所有斷點,只需發出不帶行號的 break 命令。
任何斷點都可以透過 disable/enable 命令停用/啟用,或透過 clear 命令完全清除。
(Pdb) disable 1 Disabled breakpoint 1 at c:\python36\fact.py:5 (Pdb) b Num Type Disp Enb Where 1 breakpoint keep no at c:\python36\fact.py:5 breakpoint already hit 2 times
Pdb 偵錯程式也可以從 Python 指令碼內部使用。為此,在指令碼頂部匯入 pdb,並在程式內使用 set_trace() 方法。
import pdb
def fact(x):
f = 1
for i in range(1,x+1):
pdb.set_trace()
print (i)
f = f * i
return f
if __name__=="__main__":
print ("factorial of 3=",fact(3))偵錯程式的行為將與我們在命令列環境中找到的完全相同。
資料結構
網路
關係型資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP