Linux環境使用pdb調試python的方法

小云云
發布: 2018-03-30 16:20:49
原創
2841 人瀏覽過


#

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: # (Pdb) n ### > /root/epdb1.py(7)?() ### -> print final ### (Pdb) p final ###'aaabbbccc'### (Pdb) ######使用c 可以停止目前的debug 使程式繼續執行。如果在下面的程式中繼續有 set_statement() 的申明,則又會重新進入到 debug 的狀態,讀者可以在程式碼 print final 之前再加上 set_trace() 驗證。 #########清單4. 停止debug 繼續執行程式###[root@rcc-pok-idg-2255 ~]#  python epdb1.py #### > /root/epdb1.py(4 )?() ### -> b = "bbb"### (Pdb) n ### > /root/epdb1.py(5)?() ### -> c = "ccc" ### (Pdb) c ### aaabbbccc######顯示程式碼:在 debug 的時候不一定能記住目前的程式碼區塊,如要查看特定的程式碼區塊,則可以透過使用 list 或 l 指令顯示。 list 會用箭頭 -> 指向目前 debug 的語句。

清單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 &#39;= "avfe"&#39; is not a function 
 or was not found along sys.path. 
 (Pdb) !b="afdfd"
 (Pdb)
登入後複製

#相關推薦:


#用Pdb函式庫調試Python的方式及常用的指令



使用PDB模式偵錯Python程式介紹

使用PDB簡單偵錯Python程式簡明指南

以上是Linux環境使用pdb調試python的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板