3. How to debug

一般習慣了有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

參考資料:
ċ
demoDebug.py
(0k)
Hsien-Cheng Liao,
2011年12月12日 上午4:57
ċ
demoIPythonDebug.py
(0k)
Hsien-Cheng Liao,
2011年12月12日 上午4:57
Comments