在python中使用pdb基礎除錯

2021-08-26 21:10:47 字數 4868 閱讀 1932

本文討論在沒有方便的ide工具可用的情況下,使用pdb除錯python程式

原始碼例子

例如,有模擬稅收計算的程式:

#!/usr/bin/python

def debug_demo(val):

if val <= 1600 :

print "level 1"

print 0

elif val <= 3500 :

print "level 2"

print (val - 1600) * 0.05

elif val <= 6500 :

print "level 3"

print (val - 3500) * 0.10 + (3500-1600) * 0.05

else:

print "level 4"

print (val - 6500) * 0.20 + (6500-3500) * 0.10 + (3500-1600) * 0.05

#~def debug_demo

if __name__ == "__main__":

debug_demo(4500)

debug_demo函式計算4500的入賬所需的稅收。

如何除錯?

1.加入斷點

在需要插入斷點的地方,加入紅色部分**:如果_debug值為true,則在該處開始除錯(加入_debug的原因是為了方便開啟/關閉除錯)。

#!/usr/bin/python

_debug=true

def debug_demo(val):

if _debug == true:

import pdb

pdb.set_trace()

if val <= 1600 :

print "level 1"

print 0

elif val <= 3500 :

print "level 2"

print (val - 1600) * 0.05

elif val <= 6500 :

print "level 3"

print (val - 3500) * 0.10 + (3500-1600) * 0.05

else:

print "level 4"

print (val - 6500) * 0.20 + (6500-3500) * 0.10 + (3500-1600) * 0.05

#~def debug_demo

if __name__ == "__main__":

debug_demo(4500)

2.開始執行除錯

執行程式./debug_demo.py,得到

> /usr/local/qspace/user_network/debug_demo.py(7)debug_demo()

-> if val <= 1600 :

(pdb)

-> val <= 1600 : 指示當前執行的語句,(pdb)等待你的除錯指令. pdb的指令很豐富,輸入h指令可以檢視指令的使用方法。下面簡單介紹常用指令:

檢視**上下文,l(小寫l)

(pdb) l

2 _debug=true

3 def debug_demo(val):

4 if _debug == true:

5 import pdb

6 pdb.set_trace() 7

-> if val <= 1600 :

8 print "level 1"

9 print 0

10 elif val <= 3500 :

11 print "level 2"

12 print (val - 1600) * 0.05

(pdb)

左邊是行號,右邊是**正文。

監視變數:p 變數名

(pdb) p val

4500

(pdb)

單步執行: n

-> elif val <= 3500 :

(pdb) l

5 import pdb

6 pdb.set_trace()

7 if val <= 1600 :

8 print "level 1"

9 print 0

10-> elif val <= 3500 :

11 print "level 2"

12 print (val - 1600) * 0.05

13 elif val <= 6500 :

14 print "level 3"

15 print (val - 3500) * 0.10 + (3500-1600) * 0.05

加入斷點:b 行號

(pdb) b14

執行到斷點: c

(pdb) c

> /*****

-> print "level 3"

(pdb) l

9 print 0

10 elif val <= 3500 :

11 print "level 2"

12 print (val - 1600) * 0.05

13 elif val <= 6500 :

14 b-> print "level 3"

15 print (val - 3500) * 0.10 + (3500-1600) * 0.05

16 else:

17 print "level 4"

18 print (val - 6500) * 0.20 + (6500-3500) * 0.10 + (3500-1600) * 0.05

19

執行到函式返回前: r

(pdb) r

level 3

195.0

--return--

> /****()

->none

-> print (val - 3500) * 0.10 + (3500-1600) * 0.05

(pdb)

說明:

pdb還有很多其他很多有用的指令,讀者可以自行探索。輸入h,h 命令。就可以得到命令的詳細幫助。

不過,我個人認為一般無需啟動這種除錯方法,一般使用日誌輸出進行除錯即可,除非遇到了非常微妙的錯誤。這時,單步除錯的威力便顯示出來了。

(pdb)b 1

breakpoint 1 at

c:\test.py:1

()後面的vc++除錯中斷方式。

b(reak) [[filename:]lineno|function[, condition]]

在指定的檔案、行數或函式下進行斷點設定。也可為中斷點設定中斷條件,例如要在 for迴圈下進行中斷設定或某個值出現時中斷,就可以進行相應中斷點條件的設定。如果沒有能數,則列出所有中斷點。

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 ,則會在上移之後的一層,再去執行下一層。

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]]

列出目前所在檔案中的的位置。邊續地

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)

退出除錯模式。

原文:

使用pdb除錯python

python pdb除錯 python m pdb myscript.py 注意這會重啟myscript.py,這樣啟動的話,每一行都是乙個節點 也可以在程式中這麼設定斷點 import pdb pdb.set trace 支援的命令 p 列印變數 n next step 細點執行 c contin...

使用pdb除錯python

python pdb除錯 python m pdb myscript.py 注意這會重啟myscript.py,這樣啟動的話,每一行都是乙個節點 也可以在程式中這麼設定斷點 import pdb pdb.set trace 支援的命令 p 列印變數 n next step 細點執行 c contin...

在python中使用websocket

介紹一款很帥的外掛程式autobahnpython,通過它可以在python中很方便的使用websocket進行通訊 基於twisted框架 這個外掛程式真正強大的地方是它提供了乙個 發布 訂閱模式,具體內容有空再寫,先簡單介紹一下如何建立傳統的連線。建立伺服器 必須的模組 from twisted...