Python中使用PDB库调试程序


Posted in Python onApril 05, 2015

Python自带的pdb库,发现用pdb来调试程序还是很方便的,当然了,什么远程调试,多线程之类,pdb是搞不定的。

用pdb调试有多种方式可选:

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

python -m pdb myscript.py

2. 在Python交互环境中启用调试
>>> import pdb

>>> import mymodule

>>> pdb.run(‘mymodule.test()')

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

if __name__ == "__main__":

a = 1

import pdb

pdb.set_trace()

b = 2

c = a + b

print (c)

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

常用的调试命令

h(elp),会打印当前版本Pdb可用的命令,如果要查询某个命令,可以输入 h [command],例如:“h l” — 查看list命令
l(ist),可以列出当前将要运行的代码块

(Pdb) l

497 pdb.set_trace()

498 base_data = {}

499 new_data = {}

500 try:

501 execfile(base_file_name,{},base_data)

502 -> execfile(new_file_name,{},new_data)

503 except:

504 logger.writeLog(“error! load result log error!”)

505 print “load cmp logs error!”

506 raise Exception, “load cmp logs error!”

507

b(reak), 设置断点,例如 “b 77″,就是在当前脚本的77行打上断点,还能输入函数名作为参数,断点就打到具体的函数入口,如果只敲b,会显示现有的全部断点

(Pdb) b 504

Breakpoint 4 at /home/jchen/regression/regressionLogCMP.py:504
condition bpnumber [condition],设置条件断点,下面语句就是对第4个断点加上条件“a==3” 

(Pdb) condition 4 a==3

(Pdb) b

Num Type Disp Enb Where

4 breakpoint keep yes at /home/jchen/regression/regressionLogCMP.py:504

stop only if a==3

cl(ear),如果后面带有参数,就是清除指定的断点(我在Python2.4上从来没成功过!!!);如果不带参数就是清除所有的断点
(Pdb) cl

Clear all breaks? y

disable/enable,禁用/激活断点
(Pdb) disable 3

(Pdb) b

Num Type Disp Enb Where

3 breakpoint keep no at /home/jchen/regression/regressionLogCMP.py:505

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

s(tep),跟n相似,但是如果当前有一个函数调用,那么s会进入被调用的函数体中
c(ont(inue)),让程序正常运行,直到遇到断点
j(ump),让程序跳转到指定的行数

(Pdb) j 497

> /home/jchen/regression/regressionLogCMP.py(497)compareLog()

-> pdb.set_trace()

a(rgs),打印当前函数的参数
(Pdb) a

_logger =

_base = ./base/MRM-8137.log

_new = ./new/MRM-8137.log

_caseid = 5550001

_toStepNum = 10

_cmpMap = {‘_bcmpbinarylog': ‘True', ‘_bcmpLog': ‘True', ‘_bcmpresp': ‘True'}

p,最有用的命令之一,打印某个变量
(Pdb) p _new

u'./new/MRM-8137.log'

!,感叹号后面跟着语句,可以直接改变某个变量
q(uit),退出调试
发现在命令行下调试程序也是一件挺有意思的事情,记录下来分享一下

w ,Print a stack trace, with the most recent frame at the bottom.An arrow indicates the "current frame", which determines the context of most commands. 'bt' is an alias for this command.

d ,Move the current frame one level down in the stack trace
(to a newer frame).

u ,Move the current frame one level up in the stack trace
(to an older frame).

使用 u 和 d 命令,我们可以在栈帧之间切换,用以获取其相关上下文变量信息。w可以显示最近的一些栈帧信息。

Python 相关文章推荐
用实例解释Python中的继承和多态的概念
Apr 27 Python
Django框架下在URLconf中指定视图缓存的方法
Jul 23 Python
python利用正则表达式排除集合中字符的功能示例
Oct 10 Python
python简单实例训练(21~30)
Nov 15 Python
Python实现的选择排序算法原理与用法实例分析
Nov 22 Python
python实现机器学习之多元线性回归
Sep 06 Python
Python实现带参数的用户验证功能装饰器示例
Dec 14 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
Mar 26 Python
python开启debug模式的方法
Jun 27 Python
解决Python在导入文件时的FileNotFoundError问题
Apr 10 Python
Python数据正态性检验实现过程
Apr 18 Python
浅谈Python协程
Jun 17 Python
使用PDB模式调试Python程序介绍
Apr 05 #Python
python使用calendar输出指定年份全年日历的方法
Apr 04 #Python
python获取指定网页上所有超链接的方法
Apr 04 #Python
python中字典dict常用操作方法实例总结
Apr 04 #Python
python随机生成指定长度密码的方法
Apr 04 #Python
python统计字符串中指定字符出现次数的方法
Apr 04 #Python
python使用sorted函数对列表进行排序的方法
Apr 04 #Python
You might like
基于php使用memcache存储session的详解
2013/06/25 PHP
php分页示例分享
2014/04/30 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
PHP基本语法总结
2014/09/06 PHP
详解WordPress中添加友情链接的方法
2016/05/21 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
thinkphp3.2嵌入百度编辑器ueditor的实例代码
2017/07/13 PHP
从阿里妈妈发现的几个不错的表单验证函数
2007/09/21 Javascript
基于jquery的一个简单的脚本验证插件
2010/04/05 Javascript
js 可拖动列表实现代码
2011/12/13 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
JS将表单导出成EXCEL的实例代码
2013/11/11 Javascript
jQuery获取URL请求参数的方法
2015/07/18 Javascript
javascript生成随机数方法汇总
2015/11/12 Javascript
JS多物体实现缓冲运动效果示例
2016/12/20 Javascript
js省市区级联查询(插件版&无插件版)
2017/03/21 Javascript
javascript 的变量、作用域和内存问题
2017/04/19 Javascript
详解Javascript获取缓存和清除缓存API
2017/05/25 Javascript
原生JS实现多个小球碰撞反弹效果示例
2018/01/31 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
详解JavaScript对数组操作(添加/删除/截取/排序/倒序)
2019/04/28 Javascript
vue+ESLint 配置保存 自动格式化代码
2020/03/17 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
2021/01/08 Vue.js
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
使用python实现个性化词云的方法
2017/06/16 Python
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
2020/05/03 Python
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
一道SQL面试题
2012/12/31 面试题
大学生工作推荐信范文
2013/12/02 职场文书
申请任职学生会干部自荐书范文
2014/02/13 职场文书
2014年小学教师工作自我评价
2014/09/22 职场文书
汽车转让协议书范本
2014/12/07 职场文书
2016年圣诞节寄语(一句话)
2015/12/07 职场文书
mysql备份策略的实现(全量备份+增量备份)
2021/07/07 MySQL