总结用Pdb库调试Python的方式及常用的命令


Posted in Python onAugust 18, 2016

用Pdb调试有多种方式

使用 Pdb调试 Python的程序的方式主要是下面的三种!下面逐一介绍

命令行加-m参数

命令行启动目标程序,加上-m参数,这样调用 testPdb.py的话断点就是程序执行的第一行之前

本文接下来重点讲到的实例展示就是使用这种方式进行调试的!

python -m pdb testPdb.py

在python交互环境调试

>>> import pdb
>>> import testPdb
>>> pdb.run('testPdb.test()')

代码中插入一段程序

比较常用的,就是在程序中间插入一段程序,相对于在一般 IDE 里面打上断点然后启动 debug,不过这种方式是 hardcode

if __name__ == "__main__":
 a = 1
 import pdb
 pdb.set_trace()
 b = 2
 c = a + b
 print(c)

然后正常运行脚本:python testPdb.py 到了 pdb.set_trace()那里就会定下来,然后就可以看到调试的提示符 (Pdb)了

针对上面的这段小程序的调试情况如下:

准备测试程序

接下来使用上面介绍的第一种方式来调试 Python程序,以此来介绍 pdb常用的命令,不过在开始之前先要准备好测试的程序代码:

testFun.py

这是一个会被主模块调用的子模块,用于测试使用 Pdb调试的时候,是不是可以断点从主模块跟踪进入子模块(后续有说明)

#!/usr/bin/python
# -*- coding: utf-8 -*-

def add(a, b):
 return a + b

testPdb.py

这是下面被调试的主模块的代码

#!/usr/bin/python
# -*- coding: utf-8 -*-

def sub(a, b):
 return a - b

if __name__ == "__main__":

 print ''
 import testFun
 i = 0
 a = 1
 while(i < 100):
  a = testFun.add(a, 1)
  i = i + 1
 print "累加结果:", a
 print ""

 for letter in 'Pdb':
  print "当前字母:", letter
 print ""

 fruits = ['banana', 'apple', 'mango']
 for fruit in fruits:
  print "当前水果:", fruit
 print ""


 ret = 0
 for num in range(10, 12):
  ret = sub(ret, num)
 print '循环结果:', ret
 print ""

 d = {'abc': 123, 123: "abc"}
 for (k,v) in d.items():
  print "当前键值对:", k, '-', v
 print ""

总结常用的命令

基础命令

h(elp)命令:会打印当前版本 Pdb可用的命令,如果要查询某个命令,可输入 h [command] ,例如 h l 查看 list命令

l(ist)命令:可以列出当前将要运行的代码块

断点管理

b(reak):设置断点

比如 b 12 就是在当前脚本的第 9行加上断点

比如 b sub 就是在当前脚本的 sub函数定义处加断点

除了可以在当前的脚本中添加断点之外,还可以在当前脚本对其他脚本下断点,以上面用到的代码为例 b testFun.add 就可以实现在 testFun.py脚本中的 add函数处加断点

如果只用 b 就会显示现有的全部断点

condition bpnumber [condition]:设置条件断点,比如 condition 2 a==0 ,就是在第二个断点出加条件 “a==0”

cl(ear):删除断点,如果后面带有参数,就是清楚指定的断点;如果不带参数就是清除所有的断点

disable/enable:禁用/激活断点

程序逻辑控制

下面展示的几个命令,需要知道对应的脚本的代码和行号,所以这里先截图展示下面测试需要用到的前几行代码

c(ont(inue)),让程序正常运行,直到遇到下一个断点

n(ext),让程序运行下一行,如果当前语句有一个函数调用,用n是不会进入被调用的函数体中的

下图中展示的,当对脚本断点调试到 testFun.add(a, 1)时,继续执行n,并不会进入 testFun.add(a, 1)的函数内部

s(tep),跟n相似,但如果当前有一个函数调用,那么 s会进入被调用的函数体中

下图中展示的,当对脚本断点调试到 testFun.add(a, 1)时,继续执行s,会进入 testFun.add(a, 1)对应的函数定义内部,虽然 testFun.add不是本脚本中定义的函数

j(ump),让程序跳转到指定的行数

假如当前所在行是 10,注意:假如执行了 j 20 之后,那么相当于程序直接跳到 20行,中间的 11~19行其实就直接跳过去根本没有被执行到,所以如果这段代码中有变量的声明或对象的初始化需要在 20行及之后被用到,那么等到用到的时候就可能导致报错!

打印重要信息

a(rgs),打印当前函数的参数。比如下图就是展示断点进入到 testFun.add内部之后,打印 testFun.add的参数

p,打印某个变量

退出调试

q,直接退出调试;或者使用 Ctrl+D的方式退出

总结

上面展示的使用 Pdb调试的过程其实是很简单的,文章中主要通过截图展示运行的效果。如果单纯的看一遍文章,不出意外,会很没有头绪,甚至感觉截图中的命令、输出乱七八糟,但是如果亲自动手跟着走一遍流程,花不了一小时,但是效果绝对极佳!多说一句,Python的调试器是 Pdb,可以对应学习 Linux下 C的调试器 gdb,以上就是本文全部内容,希望对大家学习与工作能有所帮助。

本文参考的相关文章如下:

《指针和字符串和字符串常量、用gdb来获取非法内存中的内容》

《Linux gdb调试器用法全面解析》

《用PDB库调试Python程序》

Python 相关文章推荐
pymssql ntext字段调用问题解决方法
Dec 17 Python
介绍Python中的__future__模块
Apr 27 Python
Django应用程序中如何发送电子邮件详解
Feb 04 Python
python+selenium识别验证码并登录的示例代码
Dec 21 Python
python print 按逗号或空格分隔的方法
May 02 Python
Python列表list排列组合操作示例
Dec 18 Python
django+tornado实现实时查看远程日志的方法
Aug 12 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
Jun 08 Python
Python接口自动化测试的实现
Aug 28 Python
pandas 数据类型转换的实现
Dec 29 Python
python实现录制全屏和选择区域录屏功能
Feb 05 Python
python基础之匿名函数详解
Apr 21 Python
Python实现命令行通讯录实例教程
Aug 18 #Python
Python采用Django开发自己的博客系统
Sep 29 #Python
浅析Python中元祖、列表和字典的区别
Aug 17 #Python
Python+django实现简单的文件上传
Aug 17 #Python
Python Django使用forms来实现评论功能
Aug 17 #Python
小小聊天室Python代码实现
Aug 17 #Python
python如何在终端里面显示一张图片
Aug 17 #Python
You might like
php错误、异常处理机制(补充)
2012/05/07 PHP
深入理解PHP内核(二)之SAPI探究
2015/11/10 PHP
Zend Framework教程之Loader以及PluginLoader用法详解
2016/03/09 PHP
php截取视频指定帧为图片
2016/05/16 PHP
深入认识javascript中的eval函数
2009/11/02 Javascript
解决JS中乘法的浮点错误的方法
2014/01/03 Javascript
JavaScript实现的背景自动变色代码
2015/10/17 Javascript
JS判断字符串变量是否含有某个字串的实现方法
2016/06/03 Javascript
基于JavaScript实现在新的tab页打开url
2016/08/04 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
2016/12/14 Javascript
javascript实现二叉树遍历的代码
2017/06/08 Javascript
微信小程序常用简易小函数总结
2019/02/01 Javascript
基于p5.js 2D图像接口的扩展(交互实现)
2020/11/30 Javascript
详解Python中的join()函数的用法
2015/04/07 Python
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
python解决方案:WindowsError: [Error 2]
2016/08/28 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
Python 70行代码实现简单算式计算器解析
2019/08/30 Python
利用python3 的pygame模块实现塔防游戏
2019/12/30 Python
Python模块相关知识点小结
2020/03/09 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
python连接mysql数据库并读取数据的实现
2020/09/25 Python
python中如何使用虚拟环境
2020/10/14 Python
如何快速一次性卸载所有python包(第三方库)呢
2020/10/20 Python
美国半成品食材配送服务商:Home Chef
2018/01/25 全球购物
大学新生欢迎词
2014/01/10 职场文书
鸿星尔克广告词
2014/03/21 职场文书
课例研修方案
2014/05/31 职场文书
关于运动会的口号
2014/06/07 职场文书
领导班子整改措施
2014/10/24 职场文书
市委常委会班子党的群众路线教育实践活动整改方案
2014/10/25 职场文书
合作与交流自我评价
2015/03/09 职场文书
毕业设计致谢词
2015/05/14 职场文书
趣味运动会新闻稿
2015/07/17 职场文书
python对文档中元素删除,替换操作
2022/04/02 Python