pdb调试python程序
时间:2008-06-23 来源:codebreaker
學習與使用 Python 至今,一直都是使用 UltraEdit 與命令列的直譯器搭配。一旦遇到需要追蹤程式碼時,也只能仰仗 Python 語言開發快速的特性,再加上 print 來除錯,但總是沒有像 VC 之類的 IDE,擁有 GUI 的除錯器來得方便。幸運的是, Python 的 pdb package 就提供了這樣一個在命令列下除錯的環境。剛開始使用時一定不會像 GUI debugger 那樣順手,但是寫個小程式,自己追蹤幾次也就熟悉了,其實是不難的(以我這樣一個沒有使用過命令列除錯的人來說)。
使用 pdb package 時, 將要除錯的 Python script 檔名做為參數,交給 %PYTHONHOME%/lib/pdb.py 就行了:
如此便會進入 pdb 的互動除錯模式:
有一個比較便利的做法是,把上述的命令寫成 bat 檔,放在 %PYTHONHOME%底下。例如一個 pdb.bat,裡面的內容是:
如此我就可以在命令列下任何地方,喚起 pdb 了,就像喚起 python 一樣。
剛進入 pdb,不會馬上執行指定的檔案。所以先設定第一個中斷點,再從那裡開始。例如:
這樣第一個中斷點就設定好了,再透過下列的命令,進行除錯。由於我比較熟悉 VC 中的除錯環境,所以我將 pdb 中於 VC debugger 的對應命令註明在後面。命令可以簡寫或完整的方式執行,例如 "b" 和 "break" 都是設定中斷點。
b(reak) [[filename:]lineno|function[, condition]]
在指定的檔案、行數或函數設下中斷點,亦可為這個中斷點設定中斷條件,例如要在 for 敘述的某個狀況下,或是某個值出現時中斷,就可以設定中斷點的條件。如果沒有參數,則列出所有中斷點。(F9)
tbreak [[filename:]lineno|function[, condition]]
和 b 一樣,但是只會中斷一次。
c(ont(inue))
繼續執行,直到遇到中斷點。(F5)
s(tep)
執行目前行;若目前行的動作是參數呼叫,則把該呼叫當成一行指令執行。(F10)
n(ext)
和 s 一樣都是執行目前行。不同的是如果目前行是參數呼叫,則進入該函式。(F11)
w(here)
列出目前 call stack 中的所在層。
d(own)
在 call stack 中往下移一層。
u( p)
在 call stack 中往上移一層。如果在上移一層之後按下 n ,則會在上移之後的一層執行下一個敘述,之前的 function call 就自動返回。
cl(ear) [bpnumber [bpnumber ...]]
清除指定的中斷點。如果沒有帶參數,則清除所有中斷點。
disable [bpnumber [bpnumber ...]]
取消所有中斷點的功能,但仍然保留這些中斷點。
enable [bpnumber [bpnumber ...]]
恢復中斷點的功能。
ignore bpnumber [count]
設定中斷點的忽略次數。如果沒指定 count,其初始 為 0。當 count 為 0 時,中斷點會正常動作。若有指定 count,則每次執行到該中斷, count 就少 1,直到 count 數為 0。
condition bpnumber [condition]
為某個中斷點指定中斷條件。
j(ump) lineno
跳到某行執行。只有在 call stack 的最底部才能作用。
l(ist) [first[, last]]
列出目前所在檔案中的位置。連續地 l 命令會一直列到檔案結尾,可以使用指定行數或範圍來列印。
a(rgs)
列出目前函式所接受的參數
p expression
在目前的環境(context)中求出 expression 的值。
pp expression
和 p 命令類似,但是使用 pprint module(沒用過 pprint,詳情請參考 Python Library Reference)。
alias [name [command]]
以一個"別名"代替"一群除錯命令",有點類似 c/c++ 的 macro(詳情請參考 Python Library Reference)。
unalias name
取消某個 alias。
[!]statement
在目前的環境(context)中執行敘述。
q(uit)
離開除錯模式。
以上是我參考 Python Library Reference 中,第 9 章 "The Python Debugger",所寫的命令備忘錄。也許對這裡的 Python 同好有幫助,如果有錯誤也請多指正!
使用 pdb package 時, 將要除錯的 Python script 檔名做為參數,交給 %PYTHONHOME%/lib/pdb.py 就行了:
1 |
%PYTHONHOME%/lib/pdb.py test.py |
如此便會進入 pdb 的互動除錯模式:
1 |
> (1)?() (Pdb) |
有一個比較便利的做法是,把上述的命令寫成 bat 檔,放在 %PYTHONHOME%底下。例如一個 pdb.bat,裡面的內容是:
1 |
c:\python23\lib\pdb.py %1 |
如此我就可以在命令列下任何地方,喚起 pdb 了,就像喚起 python 一樣。
剛進入 pdb,不會馬上執行指定的檔案。所以先設定第一個中斷點,再從那裡開始。例如:
1 |
c:\>pdb test.py > <string>(1)?() (Pdb)b 1 Breakpoint 1 at c:\test.py:1 |
這樣第一個中斷點就設定好了,再透過下列的命令,進行除錯。由於我比較熟悉 VC 中的除錯環境,所以我將 pdb 中於 VC debugger 的對應命令註明在後面。命令可以簡寫或完整的方式執行,例如 "b" 和 "break" 都是設定中斷點。
b(reak) [[filename:]lineno|function[, condition]]
在指定的檔案、行數或函數設下中斷點,亦可為這個中斷點設定中斷條件,例如要在 for 敘述的某個狀況下,或是某個值出現時中斷,就可以設定中斷點的條件。如果沒有參數,則列出所有中斷點。(F9)
tbreak [[filename:]lineno|function[, condition]]
和 b 一樣,但是只會中斷一次。
c(ont(inue))
繼續執行,直到遇到中斷點。(F5)
s(tep)
執行目前行;若目前行的動作是參數呼叫,則把該呼叫當成一行指令執行。(F10)
n(ext)
和 s 一樣都是執行目前行。不同的是如果目前行是參數呼叫,則進入該函式。(F11)
w(here)
列出目前 call stack 中的所在層。
d(own)
在 call stack 中往下移一層。
u( p)
在 call stack 中往上移一層。如果在上移一層之後按下 n ,則會在上移之後的一層執行下一個敘述,之前的 function call 就自動返回。
cl(ear) [bpnumber [bpnumber ...]]
清除指定的中斷點。如果沒有帶參數,則清除所有中斷點。
disable [bpnumber [bpnumber ...]]
取消所有中斷點的功能,但仍然保留這些中斷點。
enable [bpnumber [bpnumber ...]]
恢復中斷點的功能。
ignore bpnumber [count]
設定中斷點的忽略次數。如果沒指定 count,其初始 為 0。當 count 為 0 時,中斷點會正常動作。若有指定 count,則每次執行到該中斷, count 就少 1,直到 count 數為 0。
condition bpnumber [condition]
為某個中斷點指定中斷條件。
j(ump) lineno
跳到某行執行。只有在 call stack 的最底部才能作用。
l(ist) [first[, last]]
列出目前所在檔案中的位置。連續地 l 命令會一直列到檔案結尾,可以使用指定行數或範圍來列印。
a(rgs)
列出目前函式所接受的參數
p expression
在目前的環境(context)中求出 expression 的值。
pp expression
和 p 命令類似,但是使用 pprint module(沒用過 pprint,詳情請參考 Python Library Reference)。
alias [name [command]]
以一個"別名"代替"一群除錯命令",有點類似 c/c++ 的 macro(詳情請參考 Python Library Reference)。
unalias name
取消某個 alias。
[!]statement
在目前的環境(context)中執行敘述。
q(uit)
離開除錯模式。
以上是我參考 Python Library Reference 中,第 9 章 "The Python Debugger",所寫的命令備忘錄。也許對這裡的 Python 同好有幫助,如果有錯誤也請多指正!
相关阅读 更多 +