python的debug实用工具 pdb详解


Posted in Python onJuly 12, 2019

叨逼叨

首先,介绍一下 pdb 调试,pdb 是 python 的一个内置模块,用于命令行来调试 Python 代码。或许你会说,现在用 Pycharm 等编辑器来调试代码很方便,为啥要用命令行呢?这个问题,我曾经也这么想,直到有一次,代码必须要在 Linux 系统上跑(现在 Pycharm 也可以远程调试代码了,今天先不说这个)

使用介绍

如何添加断点?

说到 debug,肯定是要添加断点的,这里有两种方式添加断点:

在想要断点代码后添加 一行

pdb.set_trace()

若是使用这种方式,直接运行 Python 文件即可进入断点调试。

用命令行来添加断点

b line_number(代码行数)

若是使用这种方式,需要 python -m pdb xxx.py 来启动断点调试。

常用命令

先简单介绍一下使用命令,这里不用记住,等用到的时候回来查就行。

1 进入命令行Debug模式,python -m pdb xxx.py

2 h: (help)帮助

3 w: (where)打印当前执行堆栈

4 d: (down)执行跳转到在当前堆栈的深一层(个人没觉得有什么用处)

5 u: (up)执行跳转到当前堆栈的上一层

6 b: (break)添加断点

  • b 列出当前所有断点,和断点执行到统计次数
  • b line_no:当前脚本的line_no行添加断点
  • b filename:line_no:脚本filename的line_no行添加断点
  • b function:在函数function的第一条可执行语句处添加断点

7 tbreak: (temporary break)临时断点

在第一次执行到这个断点之后,就自动删除这个断点,用法和b一样

8 cl: (clear)清除断点

  • cl 清除所有断点
  • cl bpnumber1 bpnumber2... 清除断点号为bpnumber1,bpnumber2...的断点
  • cl lineno 清除当前脚本lineno行的断点
  • cl filename:line_no 清除脚本filename的line_no行的断点

9 disable:停用断点,参数为bpnumber,和cl的区别是,断点依然存在,只是不启用

10 enable:激活断点,参数为bpnumber

11 s: (step)执行下一条命令

如果本句是函数调用,则s会执行到函数的第一句
12 n: (next)执行下一条语句

如果本句是函数调用,则执行函数,接着执行当前执行语句的下一条。
13 r: (return)执行当前运行函数到结束

14 c: (continue)继续执行,直到遇到下一条断点

15 l: (list)列出源码

  • l 列出当前执行语句周围11条代码
  • l first 列出first行周围11条代码
  • l first second 列出first--second范围的代码,如果second<first,second将被解析为行数

16 a: (args)列出当前执行函数的函数

17 p expression:(print)输出expression的值

18 pp expression:好看一点的p expression

19 run:重新启动debug,相当于restart

20 q:(quit)退出debug

21 j lineno:(jump)设置下条执行的语句函数

只能在堆栈的最底层跳转,向后重新执行,向前可直接执行到行号

22)unt:(until)执行到下一行(跳出循环),或者当前堆栈结束

23)condition bpnumber conditon,给断点设置条件,当参数condition返回True的时候bpnumber断点有效,否则bpnumber断点无效

举个简单的栗子

为了验证一下 pdb 的用法,我写了个简单的 Python 代码,如下:

__author__ = 'zone'
__gzh__ = '公号:zone7'
import pdb
class MyScrapy:
 urls = []
 def start_url(self, urls):
 pdb.set_trace()
 for url in urls:
 print(url)
 self.urls.append(url)
 def parse(self):
 pdb.set_trace()
 for url in self.urls:
 result = self.request_something(url)
 def request_something(self, url):
 print('requesting...')
 data = '''<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
</body>
</html>'''
 return data
scrapy= MyScrapy()
scrapy.start_url(["http://www.zone7.cn", "http://www.zone7.cn", "http://www.zone7.cn", "http://www.zone7.cn", ])
scrapy.parse()

运行实例:(这里为了方便大家阅读,我添加了中文注释,实际运行时不会有注释的)

D:workenvScriptspython.exe D:/work_test/test/pdb_test/pdb_test.py
> d:work_test	estpdb_testpdb_test.py(11)start_url()
-> for url in urls:
(Pdb) n 注释:n(next)执行下一步
> d:work_test	estpdb_testpdb_test.py(12)start_url()
-> print(url)
(Pdb) l 注释: l(list)列出当前代码
 7 	 urls = []
 8 	
 9 	 def start_url(self, urls):
 10 	 pdb.set_trace()
 11 	 for url in urls:
 12 ->	 print(url)
 13 	 self.urls.append(url)
 14 	
 15 	 def parse(self):
 16 	 pdb.set_trace()
 17 	 for url in self.urls:
(Pdb) c 注释:c(continue),继续执行,知道遇到下一个断点
http://www.zone7.cn
http://www.zone7.cn
http://www.zone7.cn
http://www.zone7.cn
> d:work_test	estpdb_testpdb_test.py(17)parse()
-> for url in self.urls:
(Pdb) n 注释:n(next)执行下一步
> d:work_test	estpdb_testpdb_test.py(18)parse()
-> result = self.request_something(url)
(Pdb) l 注释: l(list)列出当前代码
 13 	 self.urls.append(url)
 14 	
 15 	 def parse(self):
 16 	 pdb.set_trace()
 17 	 for url in self.urls:
 18 ->	 result = self.request_something(url)
 19 	
 20 	 def request_something(self, url):
 21 	 print('requesting...')
 22 	 data = '''<!DOCTYPE html>
 23 	<html lang="en">
(Pdb) s 注释: s(step)这里是进入 request_something() 函数的意思
--Call--
> d:work_test	estpdb_testpdb_test.py(20)request_something()
-> def request_something(self, url):
(Pdb) n 注释:n(next)执行下一步
> d:work_test	estpdb_testpdb_test.py(21)request_something()
-> print('requesting...')
(Pdb) l 注释: l(list)列出当前代码
 16 	 pdb.set_trace()
 17 	 for url in self.urls:
 18 	 result = self.request_something(url)
 19 	
 20 	 def request_something(self, url):
 21 ->	 print('requesting...')
 22 	 data = '''<!DOCTYPE html>
 23 	<html lang="en">
 24 	<head>
 25 	 <meta charset="UTF-8">
 26 	 <title>Title</title>
(Pdb) p url 注释:p(print)打印出 url 变量的数据
'http://www.zone7.cn'
(Pdb) n 注释:n(next)执行下一步
requesting...
> d:work_test	estpdb_testpdb_test.py(31)request_something()
-> </html>'''
(Pdb) p data 注释:p(print)打印出指定变量的数据,这里由于赋值还没完成,所以报错
*** NameError: name 'data' is not defined
(Pdb) n 注释:n(next)执行下一步
> d:work_test	estpdb_testpdb_test.py(32)request_something()
-> return data
(Pdb) p data 注释:p(print)打印出指定变量的数据
'<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>

</body>
</html>'
(Pdb) q 注释:q(quit)退出

总结

按照上面的例子一套下来,基本的用法就可以学会了,关键还是得自己多实践,动手操练!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python操作MySQL数据库具体方法
Oct 28 Python
Python Paramiko模块的安装与使用详解
Nov 18 Python
Python中二维列表如何获取子区域元素的组成
Jan 19 Python
Python创建xml文件示例
Mar 22 Python
Pycharm学习教程(3) 代码运行调试
May 03 Python
K-means聚类算法介绍与利用python实现的代码示例
Nov 13 Python
Django添加feeds功能的示例
Aug 07 Python
实例讲解python中的序列化知识点
Oct 08 Python
python SVM 线性分类模型的实现
Jul 19 Python
Python实现爬取并分析电商评论
Jun 19 Python
pycharm 快速解决python代码冲突的问题
Jan 15 Python
numpy实现RNN原理实现
Mar 02 Python
Flask配置Cors跨域的实现
Jul 12 #Python
python调用webservice接口的实现
Jul 12 #Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 #Python
Python实现蒙特卡洛算法小实验过程详解
Jul 12 #Python
教你如何编写、保存与运行Python程序的方法
Jul 12 #Python
如何不用安装python就能在.NET里调用Python库
Jul 12 #Python
python 执行终端/控制台命令的例子
Jul 12 #Python
You might like
php入门学习知识点三 PHP上传
2011/07/14 PHP
PHP设计模式 注册表模式(多个类的注册)
2012/02/05 PHP
PHP连接操作access数据库实例
2015/03/30 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2007/02/15 Javascript
一些常用的JS功能函数代码
2009/06/23 Javascript
JavaScript自定义DateDiff函数(兼容所有浏览器)
2012/03/01 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
2013/04/17 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
2015/08/24 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
2015/10/21 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
2015/12/16 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
2016/06/22 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
2016/07/28 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
2016/08/10 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
canvas实现爱心和彩虹雨效果
2017/03/09 Javascript
详谈angularjs中路由页面强制更新的问题
2017/04/24 Javascript
最通俗易懂的javascript变量提升详解
2017/08/05 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
JavaScript体验异步更好的解决办法
2018/01/08 Javascript
vue项目中axios使用详解
2018/02/07 Javascript
关于Vue的路由权限管理的示例代码
2018/03/06 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
NestJs 静态目录配置详解
2019/03/12 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
通过图带你深入了解vue的响应式原理
2019/06/21 Javascript
Python切片工具pillow用法示例
2018/03/30 Python
appium+python adb常用命令分享
2020/03/06 Python
python mysql中in参数化说明
2020/06/05 Python
市场营销专业毕业生自荐信
2013/11/02 职场文书
业务经理岗位职责
2013/11/11 职场文书
实习生自我鉴定
2013/12/12 职场文书
学生会招新策划书
2014/02/14 职场文书
教师节寄语2015
2015/03/23 职场文书