使用pdb模块调试Python程序实例


Posted in Python onJune 02, 2015

在Python中,语法错误可以被Python解释器发现,但逻辑上错误或变量使用错误却不容易发现,如果结果没有符合预期,则需要调试,一个很好的调试工具:Python自带的pdb模块。pdb是Python自带的调试模块。使用pdb模块可以为脚本设置断点、单步执行、查看变量值等。

pdb可以用命令行参数的方式启动,也可以使用import 将其导入后再使用。

>>> dir(pdb)  

['Pdb', 'Repr', 'Restart', 'TESTCMD',.....,'re', 'run', 'runcall', 'runctx', 'runeval', 'set_trace', 'sys', 'test', 'traceback'] 

常见的pdb函数有以下几个:

【pdb.run()函数】

>>> 该函数主要用于调试语句块
>>> 基本用法如下

>>> help(pdb.run)  

Help on function run in module pdb:  

  

run(statement, globals=None, locals=None)  

>>>参数含义

statement: 要调试的语句块,以字符串的形式表示
globals:   可选参数,设置statement运行的全局环境变量
locals:     可选参数,设置statement运行的局部环境变量
>>>简单示例

>>> import pdb                # 导入调试模块  

>>> pdb.run('''''               # 调用run()函数执行一个for循环 

for i in range(3): 

    i *= 3 

    print(i) 

    ''')  

> <string>(2)<module>()       

(Pdb) n                       # (Pdb)为调试命令提示符,表示可输入调试命令  

> <string>(3)<module>()  

(Pdb) n                       # n(next)表示执行下一行  

> <string>(4)<module>()  

(Pdb) print(i)                # 打印变量i的值  

0  

(Pdb) continue                # 继续运行程序  

0  

3  

6 

【pdb.runeval()函数】
>>>该函数主要用于调试表达式
>>>基本用法如下

>>> help(pdb.runeval)  

Help on function runeval in module pdb:  

  

runeval(expression, globals=None, locals=None) 

>>> 参数含义

expression: 要调试的,
globals:   可选参数,设置statement运行的全局环境变量
locals:     可选参数,设置statement运行的局部环境变量

>>> 简单示例

>>> import pdb                  # 导入pdb模块  

>>> lst = [1, 2, 3]             # 定义一个列表  

>>> pdb.runeval('lst[1]')       # 调用runaval()函数来调试表达式lst[1]  

> <string>(1)<module>()  

(Pdb) n                         # 进入调试状态,使用n命令,单步执行  

--Return--  

> <string>(1)<module>()->2  

(Pdb) n                         # 单步执行  

2                               # 返回表达式的值  

>>> pdb.runeval('3 + 5*6/2')    # 使用runaval()函数来调试表达式3+5*6/2  

> <string>(1)<module>()->2  

(Pdb) n  

--Return--  

> <string>(1)<module>()->18  

(Pdb) n                         # 使用n命令单步执行  

18                              # 最后得出表达式的值 

【pdb.runcall()函数】

>>>该函数主要用于调试函数
>>>基本用法如下

>>> help(pdb.runcall)  

Help on function runcall in module pdb:  

  

runcall(*args, **kwds) 

>>> 参数含义
function:          函数名
args(kwds):        函数的参数
>>> 简单示例

>>> import pdb                           # 导入模块  

>>> def sum(*args):                      # 定义函数sum,求所有参数之和  

    res = 0  

    for arg in args:  

        res += arg  

    return res  

  

>>> pdb.runcall(sum, 1, 2, 3, 4)         # 使用runcall调试函数sum  

> <pyshell#53>(2)sum()  

(Pdb) n                                  # 进入调试状态,单步执行  

> <pyshell#53>(3)sum()  

(Pdb) n                                  # 单步执行  

> <pyshell#53>(4)sum()         

(Pdb) print(res)                         # 使用print打印res的值  

0  

(Pdb) continue                           # 继续执行  

10  

>>> pdb.runcall(sum, 1, 2, 3, 4, 5, 6)   # 调用runcall调试函数sum,参数不同  

  

> <pyshell#53>(2)sum()                 

(Pdb) continue                           # 继续执行  

21                                       # 函数最后返回结果 

【pdb.set_trace()函数】

>>>该函数主要用于脚本中设置硬断点
>>>基本用法如下

>>> help(pdb.set_trace)  

Help on function set_trace in module pdb:  

  

set_trace() 

>>>简单示例

# file: test.py  

  

import pdb  

  

pdb.set_trace()  

for i in range(5):  

    i *= 5  

    print(i) 

运行脚本后显示:

> d:\learn\python\test.py(6)<module>()  

-> for i in range(5):  

(Pdb) list                     # 使用list列出脚本内容  

  1     # file: test.py  

  2       

  3     import pdb  

  4       

  5     pdb.set_trace()        # 使用set_trace()设置硬断点  

  6  ->  for i in range(5):  

  7         i *= 5  

  8         print(i)  

[EOF]                          # 列出脚本内容结束  

(Pdb) continue                 # 使用continue继续执行  

0  

5  

10  

15  

20 

【pdb调试命令】
pdb中的调试命令可以完成单步执行、打印变量值、设置断点等功能。pdb主要命令如下

------------------------------------------------------------------------------  

# 完整命令                    简写命令                      描述  

------------------------------------------------------------------------------  

# args                         a                            打印当前函数的参数  

# break                        b                            设置断点  

# clear                        cl                           清除断点  

# condition                    无                           设置条件断点  

# continue                     c                            继续运行,直到遇到断点或者脚本结束  

# disable                      无                           禁用断点  

# enable                       无                           启用断点  

# help                          h                           查看pdb帮助  

# ignore                       无                           忽略断点  

# jump                         j                            跳转到指定行数运行  

# list                         l                            列出脚本清单  

# next                         n                            执行下条语句,遇到函数不进入其内部  

# print                        p                            打印变量值  

# quit                         q                            退出pdb  

# return                       r                            一致运行到函数返回  

# tbreak                       无                           设置临时断点、断点只中断一次  

# step                         s                            执行下一条语句,遇到函数进入其内部  

# where                        w                            查看所在的位置  

# !                           无                           在pdb中执行语句                     

>>>简单示例
# -*- coding:gbk -*-  

# file: prime.py  

#  

import math  

# isprime函数判断一个整数是否为素数  

# 如果i能被2到i的平方根内的任意一个数整除,  

# 则i不是素数,返回0,否则i是素数,返回1。  

def isprime(i):  

    for t in range(2, int(math.sqrt(i)) + 1):  

        if i % t == 0:  

            return 0  

  

  

print('100~110之间素数有: ')  

for i in range(100, 110):  

    if isprime(i):  

        print(i) 

先运行下面命令:

d:\Learn\Python>python -m pdb prime.py 

后输入以下命令:

d:\Learn\Python>python -m pdb prime.py  

> d:\learn\python\prime.py(4)<module>()  

-> import math  

(Pdb) list                                           # 运行前面命令后停在这里,list默认只列出11行  

  1     # -*- coding:gbk -*-  

  2     # file: prime.py  

  3     #  

  4  -> import math  

  5     # isprime函数判断一个整数是否为素数  

  6     # 如果i能被2到i的平方根内的任意一个数整除,  

  7     # 则i不是素数,返回0,否则i是素数,返回1。  

  8     def isprime(i):  

  9         for t in range(2, int(math.sqrt(i)) + 1):  

 10             if i % t == 0:  

 11                 return 0  

(Pdb) l 14,17                                        # 使用list命令,列出14行,到17行  

 14     print('100~110之间素数有: ')  

 15     for i in range(100, 110):  

 16         if isprime(i):  

 17             print(i)  

(Pdb) b 14                                           # 使用break命令设置断点  

Breakpoint 1 at d:\learn\python\prime.py:14          # 返回断点编号: 1  

(Pdb) b isprime                                      # 在函数isprime设置断点  

Breakpoint 2 at d:\learn\python\prime.py:8           # 返回断点编号: 2  

(Pdb) c                                              # 使用c命令运行运行脚本  

> d:\learn\python\prime.py(14)<module>()             # 停在断点1处,即第14行  

-> print('100~110之间素数有: ')  

(Pdb) c                                              # 使用c命令继续运行脚本  

100~110之间素数有:                                   # 第14行脚本输出  

> d:\learn\python\prime.py(9)isprime()               # 停在断点2,即isprime函数处  

-> for t in range(2, int(math.sqrt(i)) + 1):  

(Pdb) b 15                                           # 在第15行处设置断点  

Breakpoint 3 at d:\learn\python\prime.py:15  

(Pdb) disable 2                                      # 禁用断点2,即isprime函数处的断点  

(Pdb) c                                              # 使用c命令继续运行脚本  

> d:\learn\python\prime.py(15)<module>()             # 停在断点3处,即第15行  

-> for i in range(100, 110):  

(Pdb) print(i)                                       # 使用print打印变量i的值  

100  

(Pdb) c                                              # 继续运行脚本  

> d:\learn\python\prime.py(15)<module>()  

-> for i in range(100, 110):  

(Pdb) p i                                            # 打印i的值  

101  

(Pdb) enable 2                                       # 恢复断点2,即isprime函数处的断点  

(Pdb) c                                              # 继续运行脚本  

> d:\learn\python\prime.py(9)isprime()                 

-> for t in range(2, int(math.sqrt(i)) + 1):  

(Pdb) n                                              # 单步执行下一条语句                                            

> d:\learn\python\prime.py(10)isprime()  

-> if i % t == 0:  

(Pdb) print(t)                                       # 使用print打印变量t的值  

2  

(Pdb) cl                                             # 清楚所有断点,输入y确认  

Clear all breaks? y  

(Pdb) c                                              # 继续运行脚本  

103  

105  

107  

109  

(Pdb) q                                              # 使用quit(q)退出pdb调试 
Python 相关文章推荐
python列表操作使用示例分享
Feb 21 Python
pyqt4教程之实现windows窗口小示例分享
Mar 07 Python
详解Django中的过滤器
Jul 16 Python
Python中使用Queue和Condition进行线程同步的方法
Jan 19 Python
Python的净值数据接口调用示例分享
Mar 15 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
Feb 13 Python
Python 中 list 的各项操作技巧
Apr 13 Python
django创建自定义模板处理器的实例详解
Aug 14 Python
matplotlib绘图实例演示标记路径
Jan 23 Python
ORM Django 终端打印 SQL 语句实现解析
Aug 09 Python
如何使用selenium和requests组合实现登录页面
Feb 03 Python
python_mask_array的用法
Feb 18 Python
python使用xmlrpclib模块实现对百度google的ping功能
Jun 02 #Python
python基于xmlrpc实现二进制文件传输的方法
Jun 02 #Python
Python中的自省(反射)详解
Jun 02 #Python
Python中pip安装非PyPI官网第三方库的方法
Jun 02 #Python
Python中字典创建、遍历、添加等实用操作技巧合集
Jun 02 #Python
python实现的文件同步服务器实例
Jun 02 #Python
Python中for循环控制语句用法实例
Jun 02 #Python
You might like
Windows2003 下 MySQL 数据库每天自动备份
2006/12/21 PHP
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
2012/08/09 PHP
在PHP中设置、使用、删除Cookie的解决方法
2013/05/06 PHP
php mail to 配置详解
2014/01/16 PHP
php脚本运行时的超时机制详解
2016/02/17 PHP
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
jQuery中:has选择器用法实例
2014/12/30 Javascript
js实现动画特效的文字链接鼠标悬停提示的方法
2015/03/02 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
2015/07/10 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
jQuery css() 方法动态修改CSS属性
2016/09/25 Javascript
微信小程序遇到修改数据后页面不渲染的问题解决
2017/03/09 Javascript
3分钟快速搭建nodejs本地服务器方法运行测试html/js
2017/04/01 NodeJs
jQuery+pjax简单示例汇总
2017/04/21 jQuery
微信小程序之购物车功能
2020/09/23 Javascript
深入理解Angular中的依赖注入
2017/06/26 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
layui switch 开关监听 弹出确定状态转换的例子
2019/09/21 Javascript
详解Angular Karma测试的持续集成实践
2019/11/15 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
浅谈TypeScript的类型保护机制
2020/02/23 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
微信小程序开发(三):返回上一级页面并刷新操作示例【页面栈】
2020/06/01 Javascript
JS highcharts动态柱状图原理及实现
2020/10/16 Javascript
Python更新数据库脚本两种方法及对比介绍
2017/07/27 Python
Python实现的堆排序算法示例
2018/04/29 Python
python爬取基于m3u8协议的ts文件并合并
2019/04/26 Python
Django中modelform组件实例用法总结
2020/02/10 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
社团活动总结
2014/04/28 职场文书
python OpenCV学习笔记
2021/03/31 Python