pdb 是python 自帶的一個包,為python 程式提供了一個交互的源代碼調試功能,主要特性包括設定斷點、單步調試、進入函數調試、查看當前代碼、查看棧片段、動態改變變數的值等。 pdb 提供了一些常用的偵錯指令。
pdb的常用指令說明:
l 單步驟運行,跳過函數
s #step為單步運行,可進入函數
p 變數 #檢視變數值
b 行號 #break斷點設定至第幾行
. clear刪除某個斷點
cl #clear刪除所有斷點
c #return目前函數
exit #以「退出」
##偵錯記錄:
pdb設置斷點可以在程序裡加入:
import pdb
在需要設置斷點的地方加入pdb.set_trace()
執行python -m pdb test.py
下面結合具體的實例講述如何使用pdb 進行調試。
清單1. 測試程式碼範例
import pdb
a = "aaa"
pdb.set_trace()
b = "bbb"
c = " ccc"
final = a + b + c
print final
#清單2. 利用pdb 除錯
[root@rcc-pok-idg-2255 ~]# python epdb1.py
> /root/epdb1.py(4)?()
-> b = "bbb"
(Pdb) n
> /root/epdb1.py(5)?( )
-> c = "ccc"
(Pdb)
> /root/epdb1.py(6)?()
-> final = a + b + c
#合適夫
(Pdb) list
1 import pdb
2 a = "aaa"
3 pdb.set_trace()
4 b = "bbb"
5 c = "ccc"
6 -> final = a + b + c
7 print final
[EOF]
(Pdb)
[EOF]
(Pdb) n )
[EOF]
(Pdb) n )
[EOF]
epdb1.py(7)?()
-> print final
(Pdb)
列印變數的值:如果需要在偵錯過程中列印變數的值,可以直接使用p 加上變數名,但要注意的是列印僅在目前的statement 已經被執行了之後才能看到具體的值,否則會報NameError: < exceptions.NameError … ....> 錯誤。
清單3. debug 過程中列印變數
[root@rcc-pok-idg-2255 ~]# python epdb1.py
> /root/epdb1.py(4)?( )
-> b = "bbb"
(Pdb) n
> /root/epdb1.py(5)?()
-> c = "ccc"
############################################################################################################################因為(Pdb) p b ###'bbb'### (Pdb) ###'bbb'### (Pdb) n ### > /root/epdb1.py(6)?() ### - > final = a + b + c ### (Pdb) p c ###'ccc'### (Pdb) p final ### *** NameError:
清單6. debug 過程中顯示程式碼
[root@rcc-pok-idg-2255 ~]# python epdb1.py
> /root/epdb1.py(4)?( )
-> b = "bbb"
(Pdb) list
1 import pdb
2 a = "aaa)## 3 # 2 a = "aaa ## 3 2 b = "bbb"
5 c = "ccc"
6 final = a + b + c
7 pdb.set_trace()
7 pdb.set_trace()
8 # Pdb) c
> /root/epdb1.py(8)?()
-> print final
(Pdb) list
3 pdb.set_trace()
3 pdb.set_trace() ##race 3 pdb.set_trace() ##race "bbb"
5 c = "ccc"
6 final = a + b + c
7 pdb.set_trace( (Pdb)
在使用函數的情況下進行debug
#清單6. 使用函數的範例
import pdb
def combine(s1,s2 ): # define subroutine combine, which...
s3 = s1 + s2 + s1 # sandwiches s2 between copies of s1, ... #p. double quotes,...
return s3 # and returns it.
a = "aaa"
pdb.set_trace()
b = "baaa"
pdb.set_trace() ## b = "baaa"
pdb.set_trace() ## b = "baaa"## pdb. # final = combine(a,b)
print final
如果直接使用n 進行debug 則到final=combine(a,b) 這句話的時候會將其當做普通的賦值語句處理,進入到print final。如果想要對函數進行 debug 如何處理呢 ? 可以直接使用 s 進入函數區塊。函數裡面的單步調試與上面的介紹類似。如果不想在函數裡單步調試可以在斷點處直接按 r 退出到呼叫的地方。
清單 7. 對函數進行偵錯
[root@rcc-pok-idg-2255 ~]# python epdb2.py
> /root/epdb2.py(10)?()
-> b = "bbb"
(Pdb) n
> /root/epdb2.py(11)?()
-> c = "ccc"
(Pdb) n
> /root/epdb2.py(12)?()
->最終=組合(a,b)
(Pdb)s
--呼叫--
>> /root/epdb2.py(3)combine()
-> def merge(s1,s2): # 定義子程式combine,其中...
(Pdb) n
> /root/epdb2.py(4)combine()
-> 。 # 定義子程式結合起來,這...
4 -> s3 = s1 + s2 + s1 # 將s2 夾在s1 的副本之間,...
5 s3 = '"' + s3 +'"' # 將其用雙引號# # 6 return s3 #並產生它。
7
8 a = “aaa”
9 pdb.set_trace()
## 10 b = “bbb”
1
10 b = “bbb”
111115> # > /root/epdb2.py(5)combine()
-> s3 = '"' + s3 +'"' # 將其括在雙引號中,...
(Pdb) n
> /root/epdb2.py(6)combine()
-> return s3 # 並返回它。
(Pdb)n
--返回--
>> /root/epdb2.py(6)combine()->'“aaabbbaaa”'
-> return s3 # 並返回它。
(Pdb)n
>> /root/epdb2.py(13)?()
-> print Final
(Pdb)
在偵錯的時候動態改變值。是b 已經被賦值了,如果想重新改變b 的賦值,則應該使用!b。 idg-2255 ~]# python epdb2.py
> /root/epdb2.py(10)?() -> b = "bbb" (Pdb) var = "1234" (Pdb) b = "avfe" *** The specified object '= "avfe"' is not a function or was not found along sys.path. (Pdb) !b="afdfd" (Pdb)
以上是Linux環境使用pdb調試python的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!