首頁  >  文章  >  後端開發  >  用Pdb庫調試Python的方式及常用的指令

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

高洛峰
高洛峰原創
2017-02-25 11:00:281294瀏覽

大家都知道Python是自備Pdb庫,使用Pdb調試Python程式還是很方便的。但是遠端調試、多線程,Pdb是搞不定的,下面一起來看看用Pdb庫調試Python的方式及常用的指令。

用Pdb調試有多種方式

#使用 Pdb調試 Python的程式的方式主要是下面的三種!下面逐一介紹

命令列加-m參數

#命令列啟動目標程序,加上-m參數,這樣呼叫testPdb.py的話斷點就是程式執行的第一行之前

本文接下來重點講到的實例展示就是使用這種方式進行調試的!

python -m pdb testPdb.py

在python互動環境偵錯

##

>>> import pdb
>>> import testPdb
>>> pdb.run('testPdb.test()')

程式碼中插入一段程式

比較常用的,就是在程式中間插入一段程序,相對於在一般IDE 裡面打上斷點然後啟動debug,不過這種方式是

hardcode

if __name__ == "__main__":
 a = 1
 import pdb
 pdb.set_trace()
 b = 2
 c = a + b
 print(c)

#然後正常運行腳本:

python testPdb.py 到了pdb. set_trace()那裡就會定下來,然後就可以看到調試的提示符(Pdb)了

針對上面的這段小程式的調試情況如下:

準備測試程序

接下來使用上面介紹的第一種方式來調試Python程序,以此來介紹pdb常用的命令,不過在開始之前先準備好測試的程式碼:

testFun.py

這是會被主模組呼叫的子模組,用來測試使用Pdb調試的時候,是不是可以斷點從主模組追蹤進入子模組(後續有說明)

#

#!/usr/bin/python
# -*- coding: utf-8 -*-

def add(a, b):
 return a + b

testPdb.py

這是下面被偵錯的主模組的程式碼

#!/usr/bin/python
# -*- coding: utf-8 -*-

def sub(a, b):
 return a - b

if __name__ == "__main__":

 print ''
 import testFun
 i = 0
 a = 1
 while(i < 100):
  a = testFun.add(a, 1)
  i = i + 1
 print "累加结果:", a
 print ""

 for letter in &#39;Pdb&#39;:
  print "当前字母:", letter
 print ""

 fruits = [&#39;banana&#39;, &#39;apple&#39;, &#39;mango&#39;]
 for fruit in fruits:
  print "当前水果:", fruit
 print ""


 ret = 0
 for num in range(10, 12):
  ret = sub(ret, num)
 print &#39;循环结果:&#39;, ret
 print ""

 d = {&#39;abc&#39;: 123, 123: "abc"}
 for (k,v) in d.items():
  print "当前键值对:", k, &#39;-&#39;, v
 print ""

總結常用的指令

基礎指令

h(elp)指令:會列印目前版本Pdb可用的指令,如果要查詢某個指令,可輸入

h [command] ,例如h l 查看list指令

l(ist)指令:可以列出目前將要執行的程式碼區塊

斷點管理

b(reak):設定斷點

例如b 12 就是在目前腳本的第9行加上斷點

例如b sub 是在目前腳本的sub函數定義處加斷點

除了可以在目前的腳本中加入斷點之外,還可以在目前腳本對其他腳本下斷點,以上面用到的程式碼為例

b testFun.add 就可以實作在testFun.py腳本中的add函數加斷點

如果只用b 就會顯示現有的全部斷點

condition bpnumber [condition]:設定條件斷點,例如condition 2 a==0 ,就是在第二個斷點出加條件「a== 0”

cl(ear):刪除斷點,如果後面有參數,就是清楚指定的斷點;如果不帶參數就是清除所有的斷點

disable/enable:停用/啟動斷點

程式邏輯控制

下面展示的幾個指令,需要知道對應的腳本的程式碼和行號,所以這裡先截圖展示下面測試需要用到的前幾行程式碼

c(ont(inue)),讓程式正常運行,直到遇到下一個斷點

n(ext),讓程式運行下一行,如果當前語句有一個函數調用,用n是不會進入被調用的函數體中的

#下圖中展示的,當對腳本斷點調試到

testFun.當add(a, 1)時,繼續執行n,並不會進入testFun.add(a, 1)的函數內部

s(tep),跟n相似,但如果目前有函數調用,那麼s會進入被調用的函數體中

下圖中展示的,當對腳本斷點調試到

testFun.add(a, 1)時,繼續執行s,會進入testFun.add(a, 1)對應的函數定義內部,雖然testFun.add不是本腳本定義的函數

j(ump),讓程式跳到指定的行數

假如目前所在行是10,注意:假如執行了j 20 之後,那麼相當於程式直接跳到20行,中間的11~19行其實就直接跳過去根本沒有被執行到,所以如果這段程式碼中有變數的宣告或物件的初始化需要在20行及之後被用到,那麼等到用到的時候就可能導致報錯!

列印重要資訊

a(rgs),列印目前函數的參數。例如下圖就是展示斷點進入到

testFun.add內部之後,列印 testFun.add的參數

p,列印某個變數

退出偵錯

q,直接退出偵錯;或使用Ctrl+D的方式退出

總結

上面展示的使用 Pdb調試的過程其實是很簡單的,文章中主要透過截圖展示運行的效果。如果單純的看一遍文章,不出意外,會很沒有頭緒,甚至感覺截圖中的命令、輸出亂七八糟,但是如果親自動手跟著走一遍流程,花不了一小時,但是效果絕對極佳!多說一句,Python的調試器是 Pdb,可以對應學習 Linux下 C的調試器 gdb,以上就是本文全部內容,希望對大家學習與工作能有所幫助。

更多用Pdb庫調試Python的方式及常用的指令相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn