诚然,借助pycharm打断点调试代码确实很简单,很方便,也很明了,但是在实际项目开发中,经常会遇到比如在linux上调试一段代码,没有pycharm等工具支撑的时候,很多人可能会考虑在代码中打印信息来辅助定位,但是如果代码挺多,变量挺多的时候,定位起来就相当的麻烦,所以作为一个合格的python开发者,pdb调试的方法还是要掌握的
下面在linux系统以如下一段代码为例,详细演示如何利用pdb调试,首先需要导入pdb,然后在想调试的位置加上pdb.set_trace(),当程序执行的时候就会从此处进入调试位置,如下就从开始直接进行调试
1 在Linux系统创建demo.py文件,内容如下
import pdb
def get_sum(num):
sum=0
for i in range(num):
sum+=i
return sum
if __name__=="__main__":
pdb.set_trace()
num=5
sum=get_sum(num)
print(sum)
2 开始调试代码
(1)在命令行通过python demo.py执行,可以看到此处有个箭头执向赋值语句,表示即将执行此条语句,即箭头指向的位置尚未执行
[root@redrose2100 opt]# python3 demo.py
> /opt/demo.py(13)<module>()
-> num=5
(Pdb)
(2)输入小写字母 l 可以查看代码上下文 list:
(Pdb) l
8 return sum
9
10
11 if __name__=="__main__":
12 pdb.set_trace()
13 -> num=5
14 sum=get_sum(num)
15 print(sum)
[EOF]
(Pdb)
(3)通过 p xxx 可以打印xxx变量,查看xxx变量当前的值,如下确实验证了num尚未赋值
(Pdb) p num
*** NameError: name 'num' is not defined
(Pdb)
(4)输入 n 执行下一步(next)
(Pdb) n
> /opt/demo.py(14)<module>()
-> sum=get_sum(num)
(Pdb) p num
5
(Pdb)
(5)输入 s 进入到调用函数里面 step,注意,此时如果输入n,则不会进入函数调用,直接将函数调用这一行执行完成,使用s可以进入到函数里面继续看
(Pdb) s
--Call--
> /opt/demo.py(3)get_sum()
-> def get_sum(num):
(Pdb)
(6)此时可以不断的输入n或者p xxx 来调试查看变量
-> def get_sum(num):
(Pdb) n
> /opt/demo.py(4)get_sum()
-> sum=0
(Pdb) n
> /opt/demo.py(6)get_sum()
-> for i in range(num):
(Pdb) n
> /opt/demo.py(7)get_sum()
-> sum+=i
(Pdb) n
> /opt/demo.py(6)get_sum()
-> for i in range(num):
(Pdb) p sum
0
(Pdb) n
> /opt/demo.py(7)get_sum()
-> sum+=i
(Pdb) n
> /opt/demo.py(6)get_sum()
-> for i in range(num):
(Pdb) n
> /opt/demo.py(7)get_sum()
-> sum+=i
(Pdb) n
> /opt/demo.py(6)get_sum()
-> for i in range(num):
(Pdb) p sum
3
(Pdb) n
> /opt/demo.py(7)get_sum()
-> sum+=i
(Pdb) n
> /opt/demo.py(6)get_sum()
-> for i in range(num):
(Pdb) n
> /opt/demo.py(7)get_sum()
-> sum+=i
(Pdb) p sum
6
(Pdb) p i
4
(Pdb)
(7)假如现在感觉这个函数已经调试的差不多了,但是并没有执行完,可以输入
r 回到函数调用完成的位置
(Pdb) r
--Return--
> /opt/demo.py(8)get_sum()->10
-> return sum
(Pdb) p sum
10
(Pdb)
(8)假如这个时候感觉已经调试完成了,想结束了,可以直接输入 c,即可结束调试
(Pdb) c
10
[root@redrose2100 opt]#