一般習慣了有IDE介面的程式開發環境,現在使用像python這種script language,除了將中途的結果印出來外,還真的一時不知道如何debug。還好,python本身就有提供debug的工具:pdb。
使用pdb有幾種方式[1][3][5],你可以直接在命令列下打:
python -m pdb myscript.py
也可以在你的script中,加入下面的程式碼:
import pdb;
pdb.set_trace()
將pdb.set_trace()放在你想debug的程式碼前,這樣,你的script執行到你置放pdb.set_trace()的地方時就會進入pdb命令列。我已下面的這個簡單script為例:
import pdb
x = 'Hello World!'
pdb.set_trace()
y = 5
print x+y
我將pdb.set_trace()放在y=5之前,執行後,便會進入pdb命令列:
-> y = 5
(Pdb)
我們可以看到y=5便是pdb.set_trace()的下一行,而這一行目前尚未執行。這時候我們可以下面幾個命令來進行debug:
q(uit):離開pdb
n(ext):下一行
c(ont(inue)):繼續
s(tep):進入函式
r(eturn): 完成函式,返回呼叫函式的地方
l(ist) [first[, last]]:列出原始碼並標示出目前所在行數
p expression:求取expression的結果
!: 改變變數的值
當按下n以及Enter後,可以看到程式繼續執行下一行:
(Pdb) n
-> print x+y
可以用list來看看目前執行到哪一行了:
(Pdb) l 1,10
1 import pdb
2
3 x = 'Hello World!'
4
5 pdb.set_trace()
6 y = 5
7 -> print x+y
8
9 y = '%d' % y
10 print x+y
再繼續執行下一行,會出現錯誤訊息:
(Pdb) n
TypeError: "cannot concatenate 'str' and 'int' objects"
-> print x+y
原來str跟int是不能直接相加的,此時,我們便可直接修改y的內容為str進行測試
(Pdb) !y='ok'
(Pdb) p x+y
'Hello World!ok'
這次就沒有error了。
而如果你想要在pdb下也有像IPython那樣的顯示方式時,你可以使用IPython提供的加強版pdb,只要將你的程式原先加入pdb的地方換成IPython.Debugger[2][4]:
from IPython.Debugger import Tracer; debug_here = Tracer()
x = 'Hello World!'
debug_here()
y = 5
print x+y
參考資料:
[2] IPython Debugger
[3] python debug 入門