使用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