使用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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章