pdb调试

转载自:http://blog.csdn.net/jerry_1126/article/details/43915609

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

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

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

1、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  
2、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                              # 最后得出表达式的值  
3、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                                       # 函数最后返回结果  
4、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)  
5、pdb调试命令:

完整命令 简写命令 描述
args a 打印当前函数的参数
break b 设置断点
clear cl 清除断点
condition 设置条件断点
continue c或者cont 继续运行,知道遇到断点或者脚本结束
disable 禁用断点
enable 启用断点
help h 查看pdb帮助
ignore 忽略断点
jump j 跳转到指定行数运行
list l 列出脚本清单
next n 执行下条语句,遇到函数不进入其内部
p p 打印变量值,也可以用print
quit q 退出 pdb
return r 一直运行到函数返回
tbreak 设置临时断点,断点只中断一次
step s 执行下一条语句,遇到函数进入其内部
where w 查看所在的位置
! 在pdb中执行语句

另一个gdb调试https://www.ibm.com/developerworks/cn/linux/l-cn-pythondebugger/









猜你喜欢

转载自blog.csdn.net/Agoni_xiao/article/details/78427420
pdb