使用pdb調試python程序

使用python自帶的pdb庫對python的程序進行調試,簡直方便到家~~

以下是常用的命令:


命令 用途
args/a 打印當前函數的參數
break/b 設置斷點
clear/cl 清除斷點
continue/c 繼續執行程序
disable 禁用斷點
enable 啓動斷點
ignore 忽略斷點
jump/j 跳轉到指定行數運行
list/l 查看當前的代碼段
step/s 執行下一步,遇到函數進入其內部
return/r 執行代碼直到從當前函數返回
exit/q 終止並退出
next/n 執行下一行,遇到函數不進入其內部
pp 變量 打印變量的值
tbreak 設置臨時斷點,斷點只終端一次
where/w 查看所在的位置
help 幫助


接下來用幾個例子介紹一下pdb的使用

用pdb進行調試有多種方式可選,這裏只介紹兩種


1. 命令行啓動目標程序


# pdb_test1.py 

import pdb

a = 0

for i in range(10):
        a = a+i
        print a

print 'end!'
print a


以上面的程序爲例子,通過命令行來啓動目標程序是指不在程序的代碼中手動加斷點,而是通過執行以下命令來調試,通過這種方式調試程序,斷點就是程序執行第一行之前


[vagrant@localhost test_pdb]$ python -m pdb pdb_test1.py    # 開始調試pdb_test1.py程序
> /home/vagrant/test_pdb/pdb_test1.py(1)<module>()
-> import pdb                                               # 斷點就是程序執行第一行之前
(Pdb) 


接下來我們就使用以上的命令調試程序


[vagrant@localhost test_pdb]$ python -m pdb pdb_test1.py    # 開始調試pdb_test1.py程序
> /home/vagrant/test_pdb/pdb_test1.py(1)<module>()
-> import pdb                                               # 斷點就是程序執行第一行之前
(Pdb) n
> /home/vagrant/test_pdb/pdb_test1.py(3)<module>()
-> a = 0
(Pdb) n                                                     # 執行下一行
> /home/vagrant/test_pdb/pdb_test1.py(5)<module>()
-> for i in range(10):
(Pdb) n
> /home/vagrant/test_pdb/pdb_test1.py(6)<module>()
-> a = a+i
(Pdb) pp i                                                  # 打印i的值
0                                                           # i=0
(Pdb) pp a                                                  # 打印a的值
0                                                           # a=0
(Pdb) n
> /home/vagrant/test_pdb/pdb_test1.py(7)<module>()
-> print a
(Pdb) n
0
> /home/vagrant/test_pdb/pdb_test1.py(5)<module>()
-> for i in range(10):
(Pdb) pp i                                                  # 打印i的值
0                                                           # i=0,因爲 for i in range(10) 這一句還沒有執行,i的值並沒有增加
(Pdb) n
> /home/vagrant/test_pdb/pdb_test1.py(6)<module>()
-> a = a+i
(Pdb) pp i                                                  # 打印i的值,i=1
1
(Pdb) n
> /home/vagrant/test_pdb/pdb_test1.py(7)<module>()
-> print a
(Pdb) pp a                                                  # 打印a的值,a=1
1
(Pdb) n
1
> /home/vagrant/test_pdb/pdb_test1.py(5)<module>()
-> for i in range(10):
(Pdb) l                                                     # 顯示程序執行到哪一行
  1     import pdb
  2     
  3     a = 0
  4     
  5  -> for i in range(10):                                 # 箭頭所指就是程序執行到的地方
  6         a = a+i
  7         print a
  8     
  9     print 'end!'
 10     print a
[EOF]
(Pdb) r                                                     # 執行代碼直到從當前函數返回
3
6
10
15
21
28
36
45
end!
45
--Return--
> /home/vagrant/test_pdb/pdb_test1.py(10)<module>()->None
-> print a                                                   # 執行到了程序的最後一行
(Pdb) l
  5     for i in range(10):
  6         a = a+i
  7         print a
  8     
  9     print 'end!'
 10  -> print a
[EOF]
(Pdb) pp a
45 
(Pdb) q                                                      # 退出調試


2. 設置硬斷點進行調試


通過在代碼段中加入以下代碼,可以在程序中設置斷點

pdb.set_trace()  


# pdb_test2.py 

import pdb

a = 0

pdb.set_trace()        # 在這裏設置了硬斷點

for i in range(10):
        a = a+i
        print a

print 'end!'
print a


設置斷點後,再調試程序直接執行一下命令就可以了


[vagrant@localhost test_pdb]$ python pdb_test2.py      # 開始調試程序
> /home/vagrant/test_pdb/pdb_test2.py(7)<module>()
-> for i in range(10):                                 
(Pdb) l
  2     
  3     a = 0
  4     
  5     pdb.set_trace()
  6     
  7  -> for i in range(10):                            # 程序直接從斷點的下一行代碼進行調試
  8         a = a+i
  9         print a
 10     
 11     print 'end!'
 12     print a
(Pdb) c                                                # 繼續運行,直到遇到斷點或腳本結束
0
1
3
6
10
15
21
28
36
45
end!
45
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章