总结用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 相关文章推荐
全面解析Python的While循环语句的使用方法
Oct 13 Python
Python连接PostgreSQL数据库的方法
Nov 28 Python
Python基于分水岭算法解决走迷宫游戏示例
Sep 26 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
Jan 04 Python
python解析html提取数据,并生成word文档实例解析
Jan 22 Python
python 字符串和整数的转换方法
Jun 25 Python
Windows下将Python文件打包成.EXE可执行文件的方法
Aug 03 Python
Python实现去除列表中重复元素的方法总结【7种方法】
Feb 16 Python
python 实现返回一个列表中出现次数最多的元素方法
Jun 11 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
Jan 20 Python
计算Python Numpy向量之间的欧氏距离实例
May 22 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
转生史莱姆:萌王第一次撸串开心到飞起,哥布塔撸串却神似界王神
2018/11/30 日漫
第十三节 对象串行化 [13]
2006/10/09 PHP
mysql建立外键
2006/11/25 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
2011/07/03 PHP
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
fckeditor 获取文本框值的实现代码
2009/02/09 Javascript
js 对象是否存在判断
2009/07/15 Javascript
网站页面自动跳转实现方法PHP、JSP(上)
2010/08/01 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
jquery插件之定时查询待处理任务数量
2014/05/01 Javascript
JavaScript匿名函数与委托使用示例
2014/07/22 Javascript
浅析jQuery EasyUI中的tree使用指南
2014/12/18 Javascript
javascript实现获取浏览器版本、操作系统类型
2015/01/29 Javascript
详解AngularJS中的作用域
2015/06/17 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
微信JSSDK调用微信扫一扫功能的方法
2017/07/25 Javascript
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
微信小程序实现原生步骤条
2019/07/25 Javascript
Python基于Tkinter的HelloWorld入门实例
2015/06/17 Python
Python实现购物车程序
2018/04/16 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
2018/12/29 Python
python Pexpect 实现输密码 scp 拷贝的方法
2019/01/03 Python
Python帮你微信头像任意添加装饰别再@微信官方了
2019/09/25 Python
python学生管理系统的实现
2020/04/05 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
6号汽车旅馆预订:Motel 6
2018/02/11 全球购物
真正的英国宝藏:Mappin & Webb
2019/05/05 全球购物
大学校庆策划书
2014/01/31 职场文书
预备党员表决心书
2014/03/11 职场文书
考研经验交流会策划书
2015/11/02 职场文书
推普标语口号大全
2015/12/26 职场文书
2019送给家人们的中秋节祝福语
2019/08/15 职场文书
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python
Python  序列化反序列化和异常处理的问题小结
2022/12/24 Python