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操作json数据的一个简单例子
Apr 17 Python
Python中实现从目录中过滤出指定文件类型的文件
Feb 02 Python
在GitHub Pages上使用Pelican搭建博客的教程
Apr 25 Python
Python函数式编程指南(二):从函数开始
Jun 24 Python
Python学习之Anaconda的使用与配置方法
Jan 04 Python
Python中文件的读取和写入操作
Apr 27 Python
flask session组件的使用示例
Dec 25 Python
Python (Win)readline和tab补全的安装方法
Aug 27 Python
wxPython窗体拆分布局基础组件
Nov 19 Python
python实现从wind导入数据
Dec 03 Python
Python while true实现爬虫定时任务
Jun 08 Python
UI自动化定位常用实现方法代码示例
Oct 27 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的输出:缓存并压缩动态页面
2013/06/11 PHP
学习php设计模式 php实现工厂模式(factory)
2015/12/07 PHP
Laravel中注册Facades的步骤详解
2016/03/16 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
2019/04/30 PHP
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
文本框的字数限制功能jquery插件
2009/11/24 Javascript
jQuery学习5 jQuery事件模型
2010/02/07 Javascript
JavaScript访问样式表代码
2010/10/15 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
javascript版的in_array函数(判断数组中是否存在特定值)
2014/05/09 Javascript
js中的caller和callee属性介绍和例子
2014/06/07 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
在AngularJS应用中实现一些动画效果的代码
2015/06/18 Javascript
js密码强度校验
2015/11/10 Javascript
精通JavaScript的this关键字
2020/05/28 Javascript
js实现砖头在页面拖拉效果
2020/11/20 Javascript
简单实现node.js图片上传
2016/12/18 Javascript
Vue的Flux框架之Vuex状态管理器
2017/07/30 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
node中使用es6/7/8(支持性与性能)
2019/03/28 Javascript
JavaScript中的ES6 Proxy的具体使用
2019/06/16 Javascript
解决LayUI数据表格复选框不居中显示的问题
2019/09/25 Javascript
微信小程序canvas截取任意形状的实现代码
2020/01/13 Javascript
[01:31:03]DOTA2完美盛典全回顾 见证十五项大奖花落谁家
2017/11/28 DOTA
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
Python简单实现两个任意字符串乘积的方法示例
2018/04/12 Python
python后端接收前端回传的文件方法
2019/01/02 Python
暇步士官网:Hush Puppies
2016/09/22 全球购物
爱他美官方海外旗舰店:Aptamil奶粉
2017/12/22 全球购物
秋季运动会加油稿200字
2014/01/11 职场文书
银行贷款承诺书
2014/03/29 职场文书
《开国大典》教学反思
2014/04/19 职场文书
运动会广播稿150字(9篇)
2014/09/20 职场文书
土建技术员岗位职责
2015/04/11 职场文书
地震捐款简报
2015/07/21 职场文书
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
2021/06/21 MySQL