pdb調試工具


調試--pdb

pdb是基於命令行的調試工具,非常類似gnu的gdb(調試c/c++)。

命令 簡寫命令 作用
break b 設置斷點
continue c 繼續執行程序
list l 查看當前行的代碼段
step s 進入函數
return r 執行代碼直到從當前函數返回
quit q 中止並退出
next n 執行下一行
print p 打印變量的值
help h 幫助
args a 查看傳入參數
  回車 重復上一條命令
break b 顯示所有斷點
break lineno b lineno 在指定行設置斷點
break file:lineno b file:lineno 在指定文件的行設置斷點
clear num   刪除指定斷點
bt   查看函數調用棧幀

執行時調試

程序啟動,停止在第一行等待單步調試。

python -m pdb some.py

交互調試

進入python或ipython解釋器

import pdb
pdb.run('testfun(args)') #此時會打開pdb調試,注意:先使用s跳轉到這個testfun函數中,然后就可以使用l看到代碼了

程序里埋點

當程序執行到pdb.set_trace() 位置時停下來調試

代碼上下文
...
import pdb pdb.set_trace() ...

日志調試

demo 1

import pdb 
a = "aaa" pdb.set_trace() b = "bbb" c = "ccc" final = a + b + c print final #調試方法 # 《1 顯示代碼》 # l---->能夠顯示當前調試過程中的代碼,其實l表示list列出的意思 #如下,途中,-> 指向的地方表示要將要執行的位置 # 2 a = "aaa" # 3 pdb.set_trace() # 4 b = "bbb" # 5 c = "ccc" # 6 pdb.set_trace() # 7 -> final = a + b + c # 8 print final # 《2 執行下一行代碼》 # n---->能夠向下執行一行代碼,然后停止運行等待繼續調試 n表示next的意思 # 《3 查看變量的值》 # p---->能夠查看變量的值,p表示prit打印輸出的意思 #例如: # p name 表示查看變量name的值

demo 2

import pdb 
a = "aaa" pdb.set_trace() b = "bbb" c = "ccc" pdb.set_trace() final = a + b + c print final # 《4 將程序繼續運行》 # c----->讓程序繼續向下執行,與n的區別是n只會執行下面的一行代碼,而c會像python xxxx.py一樣 繼續執行不會停止;c表示continue的意思 # 《5 set_trace()》 # 如果程序中有多個set_trace(),那么能夠讓程序在使用c的時候停留在下一個set_trace()位置處

demo 3

#coding=utf-8
import pdb 

def combine(s1,s2): s3 = s1 + s2 + s1 s3 = '"' + s3 +'"' return s3 a = "aaa" pdb.set_trace() b = "bbb" c = "ccc" final = combine(a,b) print final # 《6 設置斷點》 # b---->設置斷點,即當使用c的時候,c可以在遇到set_trace()的時候停止,也可以在遇到標記有斷點的地方停止;b表示break的意思 #例如: #b 11 在第11行設置斷點,注意這個11可以使用l來得到 # (Pdb) l # 4 s3 = s1 + s2 + s1 # 5 s3 = '"' + s3 +'"' # 6 return s3 # 7 a = "aaa" # 8 pdb.set_trace() # 9 -> b = "bbb" # 10 c = "ccc" # 11 final = combine(a,b) # 12 print final # [EOF] # (Pdb) b 11 # Breakpoint 1 at /Users/wangmingdong/Desktop/test3.py:11 # (Pdb) c # > /Users/wangmingdong/Desktop/test3.py(11)<module>() # -> final = combine(a,b) # (Pdb) l # 6 return s3 # 7 a = "aaa" # 8 pdb.set_trace() # 9 b = "bbb" # 10 c = "ccc" # 11 B-> final = combine(a,b) # 12 print final # 《7 進入函數繼續調試》 # s---->進入函數里面繼續調試,如果使用n表示把一個函數的調用當做一條語句執行過去,而使用s的話,會進入到這個函數 並且停止 #例如 # (Pdb) l # 6 return s3 # 7 a = "aaa" # 8 pdb.set_trace() # 9 b = "bbb" # 10 c = "ccc" # 11 B-> final = combine(a,b) # 12 print final # [EOF] # (Pdb) s # --Call-- # > /Users/wangmingdong/Desktop/test3.py(3)combine() # -> def combine(s1,s2): # (Pdb) l # 1 import pdb # 2 # 3 -> def combine(s1,s2): # 4 s3 = s1 + s2 + s1 # 5 s3 = '"' + s3 +'"' # 6 return s3 # 7 a = "aaa" # 8 pdb.set_trace() # 9 b = "bbb" # 10 c = "ccc" # 11 B final = combine(a,b) # (Pdb) # 《8 查看傳遞到函數中的變量》 # a---->調用一個函數時,可以查看傳遞到這個函數中的所有的參數;a表示arg的意思 #例如: # (Pdb) l # 1 #coding=utf-8 # 2 import pdb # 3 # 4 -> def combine(s1,s2): # 5 s3 = s1 + s2 + s1 # 6 s3 = '"' + s3 +'"' # 7 return s3 # 8 # 9 a = "aaa" # 10 pdb.set_trace() # 11 b = "bbb" # (Pdb) a # s1 = aaa # s2 = bbb # 《9 執行到函數的最后一步》 # r----->如果在函數中不想一步步的調試了,只是想到這個函數的最后一條語句那個位置,比如return語句,那么就可以使用r;r表示return的意思

demo 4

In [1]: def pdb_test(arg):
   ...:     for i in range(arg): ...: print(i) ...: return arg ...: In [2]: #在python交互模式中,如果想要調試這個函數,那么可以  In [3]: #采用,pdb.run的方式,如下:  In [4]: import pdb In [5]: pdb.run("pdb_test(10)") > <string>(1)<module>() (Pdb) s --Call-- > <ipython-input-1-ef4d08b8cc81>(1)pdb_test() -> def pdb_test(arg): (Pdb) l 1 -> def pdb_test(arg): 2 for i in range(arg): 3 print(i) 4 return arg [EOF] (Pdb) n > <ipython-input-1-ef4d08b8cc81>(2)pdb_test() -> for i in range(arg): (Pdb) l 1 def pdb_test(arg): 2 -> for i in range(arg): 3 print(i) 4 return arg [EOF] (Pdb) n > <ipython-input-1-ef4d08b8cc81>(3)pdb_test() -> print(i) (Pdb) 0 > <ipython-input-1-ef4d08b8cc81>(2)pdb_test() -> for i in range(arg): (Pdb) > <ipython-input-1-ef4d08b8cc81>(3)pdb_test() -> print(i) (Pdb) 1 > <ipython-input-1-ef4d08b8cc81>(2)pdb_test() -> for i in range(arg): (Pdb) demo 5 運行過程中使用pdb修改變量的值 In [7]: pdb.run("pdb_test(1)") > <string>(1)<module>() (Pdb) s --Call-- > <ipython-input-1-ef4d08b8cc81>(1)pdb_test() -> def pdb_test(arg): (Pdb) a arg = 1 (Pdb) l 1 -> def pdb_test(arg): 2 for i in range(arg): 3 print(i) 4 return arg [EOF] (Pdb) !arg = 100 #!!!這里是修改變量的方法 (Pdb) n > <ipython-input-1-ef4d08b8cc81>(2)pdb_test() -> for i in range(arg): (Pdb) l 1 def pdb_test(arg): 2 -> for i in range(arg): 3 print(i) 4 return arg [EOF] (Pdb) p arg 100 (Pdb)

使用所學的pdb調試技巧對其進行調試出bug

#coding=utf-8
import pdb 

def add3Nums(a1,a2,a3): result = a1+a2+a3 return result def get3NumsAvarage(s1,s2): s3 = s1 + s2 + s1 result = 0 result = add3Nums(s1,s2,s3)/3 if __name__ == '__main__': a = 11 # pdb.set_trace() b = 12 final = get3NumsAvarage(a,b) print final

pdb 調試有個明顯的缺陷就是對於多線程,遠程調試等支持得不夠好,同時沒有較為直觀的界面顯示,不太適合大型的 python 項目。而在較大的 python 項目中,這些調試需求比較常見,因此需要使用更為高級的調試工具。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM