Python中如何使用pdb工具调试代码
作者:redrose2100   类别:    日期:2022-05-10 03:09:06    阅读:1070 次   消耗积分:0 分

诚然,借助pycharm打断点调试代码确实很简单,很方便,也很明了,但是在实际项目开发中,经常会遇到比如在linux上调试一段代码,没有pycharm等工具支撑的时候,很多人可能会考虑在代码中打印信息来辅助定位,但是如果代码挺多,变量挺多的时候,定位起来就相当的麻烦,所以作为一个合格的python开发者,pdb调试的方法还是要掌握的

下面在linux系统以如下一段代码为例,详细演示如何利用pdb调试,首先需要导入pdb,然后在想调试的位置加上pdb.set_trace(),当程序执行的时候就会从此处进入调试位置,如下就从开始直接进行调试

1 在Linux系统创建demo.py文件,内容如下

  1. import pdb
  2. def get_sum(num):
  3. sum=0
  4. for i in range(num):
  5. sum+=i
  6. return sum
  7. if __name__=="__main__":
  8. pdb.set_trace()
  9. num=5
  10. sum=get_sum(num)
  11. print(sum)

2 开始调试代码

(1)在命令行通过python demo.py执行,可以看到此处有个箭头执向赋值语句,表示即将执行此条语句,即箭头指向的位置尚未执行

  1. [root@redrose2100 opt]# python3 demo.py
  2. > /opt/demo.py(13)<module>()
  3. -> num=5
  4. (Pdb)

(2)输入小写字母 l 可以查看代码上下文 list:

  1. (Pdb) l
  2. 8 return sum
  3. 9
  4. 10
  5. 11 if __name__=="__main__":
  6. 12 pdb.set_trace()
  7. 13 -> num=5
  8. 14 sum=get_sum(num)
  9. 15 print(sum)
  10. [EOF]
  11. (Pdb)

(3)通过 p xxx 可以打印xxx变量,查看xxx变量当前的值,如下确实验证了num尚未赋值

  1. (Pdb) p num
  2. *** NameError: name 'num' is not defined
  3. (Pdb)

(4)输入 n 执行下一步(next)

  1. (Pdb) n
  2. > /opt/demo.py(14)<module>()
  3. -> sum=get_sum(num)
  4. (Pdb) p num
  5. 5
  6. (Pdb)

(5)输入 s 进入到调用函数里面 step,注意,此时如果输入n,则不会进入函数调用,直接将函数调用这一行执行完成,使用s可以进入到函数里面继续看

  1. (Pdb) s
  2. --Call--
  3. > /opt/demo.py(3)get_sum()
  4. -> def get_sum(num):
  5. (Pdb)

(6)此时可以不断的输入n或者p xxx 来调试查看变量

  1. -> def get_sum(num):
  2. (Pdb) n
  3. > /opt/demo.py(4)get_sum()
  4. -> sum=0
  5. (Pdb) n
  6. > /opt/demo.py(6)get_sum()
  7. -> for i in range(num):
  8. (Pdb) n
  9. > /opt/demo.py(7)get_sum()
  10. -> sum+=i
  11. (Pdb) n
  12. > /opt/demo.py(6)get_sum()
  13. -> for i in range(num):
  14. (Pdb) p sum
  15. 0
  16. (Pdb) n
  17. > /opt/demo.py(7)get_sum()
  18. -> sum+=i
  19. (Pdb) n
  20. > /opt/demo.py(6)get_sum()
  21. -> for i in range(num):
  22. (Pdb) n
  23. > /opt/demo.py(7)get_sum()
  24. -> sum+=i
  25. (Pdb) n
  26. > /opt/demo.py(6)get_sum()
  27. -> for i in range(num):
  28. (Pdb) p sum
  29. 3
  30. (Pdb) n
  31. > /opt/demo.py(7)get_sum()
  32. -> sum+=i
  33. (Pdb) n
  34. > /opt/demo.py(6)get_sum()
  35. -> for i in range(num):
  36. (Pdb) n
  37. > /opt/demo.py(7)get_sum()
  38. -> sum+=i
  39. (Pdb) p sum
  40. 6
  41. (Pdb) p i
  42. 4
  43. (Pdb)

(7)假如现在感觉这个函数已经调试的差不多了,但是并没有执行完,可以输入
r 回到函数调用完成的位置

  1. (Pdb) r
  2. --Return--
  3. > /opt/demo.py(8)get_sum()->10
  4. -> return sum
  5. (Pdb) p sum
  6. 10
  7. (Pdb)

(8)假如这个时候感觉已经调试完成了,想结束了,可以直接输入 c,即可结束调试

  1. (Pdb) c
  2. 10
  3. [root@redrose2100 opt]#
始终坚持开源开放共享精神,同时感谢您的充电鼓励和支持!
版权所有,转载本站文章请注明出处:redrose2100, http://blog.redrose2100.com/article/134
个人成就
  • 2022年 : 371 篇 
  • 2023年 : 211 篇 
  • 2024年 : 31 篇 
  • 2025年 : 0 篇 
  • 博客总数: 613 
  • 阅读总量: 661710 
测试开发技术全栈公众号
DevOps技术交流微信群