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

在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的值 

(Pdb) continue                # 继续运行程序 


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的值 

(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继续执行 


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的值 

(Pdb) cl                                             # 清楚所有断点,输入y确认 
Clear all breaks? y 
(Pdb) c                                              # 继续运行脚本 
103 
105 
107 
109 
(Pdb) q                                              # 使用quit(q)退出pdb调试

(0)

相关推荐

  • 总结用Pdb库调试Python的方式及常用的命令

    用Pdb调试有多种方式 使用 Pdb调试 Python的程序的方式主要是下面的三种!下面逐一介绍 命令行加-m参数 命令行启动目标程序,加上-m参数,这样调用 testPdb.py的话断点就是程序执行的第一行之前 本文接下来重点讲到的实例展示就是使用这种方式进行调试的! python -m pdb testPdb.py 在python交互环境调试 >>> import pdb >>> import testPdb >>> pdb.run('testPd

  • 使用Python中PDB模块中的命令来调试Python代码的教程

    你有多少次陷入不得不更改别人代码的境地?如果你是一个开发团队的一员,那么你遇到上述境地的次数比你想要的还要多.然而,Python中有一个整洁的调试特性(像其他大多数语言一样),在这种情况下使用非常方便.本文是一篇快速教程,希望它能让你的编码生活更加容易. 1. 一个混乱的程序 出于本教程的目的,让我们研究一下下面的简单程序. 这个程序接收两个命令行参数,然后执行加法和减法操作. (假设用户输入的是有效值,因此代码中我们没有进行错误处理.) import sys def add(num1=0, n

  • Python中使用PDB库调试程序

    Python自带的pdb库,发现用pdb来调试程序还是很方便的,当然了,什么远程调试,多线程之类,pdb是搞不定的. 用pdb调试有多种方式可选: 1. 命令行启动目标程序,加上-m参数,这样调用myscript.py的话断点就是程序的执行第一行之前 复制代码 代码如下: python -m pdb myscript.py 2. 在Python交互环境中启用调试 复制代码 代码如下: >>> import pdb >>> import mymodule >>

  • 使用PDB简单调试Python程序简明指南

    在 Python 中也可以像 gcc/gdb 那样调试程序,只要在运行 Python 程序时引入 pdb 模块(假设要调试的程序名为 d.py): 复制代码 代码如下: $ vi d.py #!/usr/bin/python def main():         i, sum = 1, 0         for i in xrange(100):                 sum = sum + i         print sum if __name__ == '__main__'

  • 使用PDB模式调试Python程序介绍

    以前在windows下一直用的idel带的功能调试python程序,在linux下没调试过.(很多时候只是print)就从网上查找一下~ 方法: 复制代码 代码如下: python -m pdb a.py a.py是python文件. (Pdb)模式下的常用命令: q 退出debug h 即help,打印所有可以命令 h w 打印命令 w 的含意 n 执行当前行直到到达下一行或直到它返回 s 执行当前行,一有可能就停止(比如当前行有一个函数调用).它和n(next)的区别是当前行中有函数调用时s

  • python pdb调试方法分享

    复制代码 代码如下: import pdb def pdb_test(arg):    for i in range(arg):        print(i)    return arg pdb.run("pdb_test(3)") b 函数名.行号: 打断点,b可以查询所有的断点. 复制代码 代码如下: (Pdb) b pdb_testBreakpoint 1 at c:\users\plpcc\desktop\pdbtest.py:3(Pdb) bNum Type        

  • python的pdb调试命令的命令整理及实例

    python的pdb调试命令的命令整理及实例 一.命令整理 pdb调试命令 完整命令 简写命令 描述 args a 打印当前函数的参数 break b 设置断点 clear cl 清除断点 condition 无 设置条件断点 continue c或者cont 继续运行,知道遇到断点或者脚本结束 disable 无 禁用断点 enable 无 启用断点 help h 查看pdb帮助 ignore 无 忽略断点 jump j 跳转到指定行数运行 list l 列出脚本清单 next n 执行下条语

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

    在Python中,语法错误可以被Python解释器发现,但逻辑上错误或变量使用错误却不容易发现,如果结果没有符合预期,则需要调试,一个很好的调试工具:Python自带的pdb模块.pdb是Python自带的调试模块.使用pdb模块可以为脚本设置断点.单步执行.查看变量值等. pdb可以用命令行参数的方式启动,也可以使用import 将其导入后再使用. 复制代码 代码如下: >>> dir(pdb)  ['Pdb', 'Repr', 'Restart', 'TESTCMD',.....,'

  • 调试Python程序代码的几种方法总结

    程序能一次写完并正常运行的概率很小,基本不超过1%.总会有各种各样的bug需要修正.有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug. 第一种方法简单直接粗暴有效,就是用print把可能有问题的变量打印出来看看: # err.py def foo(s): n = int(s) print '>>> n = %d' % n return 10 / n def main(): f

  • 使用spyder3调试python程序的实现步骤

    目录 Spyder官方文档地址 开始调试 打断点的两种姿势 普通的breakpoint 带条件的breakpoint 总结一下刚刚所讲的 剩下的一些细节 Step Into Return 说是简明教程,其实是我自己尝试用spyder调试python程序的过程的一个记录,因为spyder的调试功能是基于pdb,而我又没有pdb的基础,所以刚开始上手时感觉很不习惯,而且那时我又很懒,没去找官方文档,仅仅在百度和csdn上找了找,没找到比较好的资料,于是放弃了,过了一段时间之后,突然又心血来潮,去找了

  • 利用Pycharm断点调试Python程序的方法

    1.代码 准备没有语法错误的Python程序: #!/usr/bin/python import numpy as np class Network: def __init__(self,sizes): self.num_layers=len(sizes) self.sizes=sizes self.biases=[np.random.randn(y,1) for y in sizes[1:]] self.weights=[np.random.randn(x,y) \ for x,y in zi

  • VSCode基础使用与VSCode调试python程序入门的图文教程

    用VSCode编程是需要依赖扩展的.写python需要安装python的扩展,写C++需要安装C++的扩展.刚打开编辑器的时候,它一般会推荐一些扩展,你如果什么都不知道,可以先安装官方推荐的这些扩展: 修改VSCode的一些选项的默认值 VSCode有很多选项可以被修改,其各个选项都有默认值,这些默认值存储在"\settings.json"中(不过我没找到这个文件),用户如果想修改某些选项的值(比如:修改字体的大小),VSCode会自动帮我们生成一个"settings.jso

  • Python中使用Tkinter模块创建GUI程序实例

    使用Tkinter模块来创建简单的GUI程序. Tkinter的Widgets有:Button.Canvas.Checkbutton.Entry.Frame.Label.Listbox.Menu.Menubutton.Message.Radiobutton.Scales.Scrollbar.TEXT.Toplevel等. 例: 复制代码 代码如下: # This program displays an empty window. import Tkinter def main():   main

  • 一个简单的python程序实例(通讯录)

    核心代码: 复制代码 代码如下: #!/usr/bin/python#Filename:friendbook.pyimport cPickle as pimport sysimport timeimport os ab={'Xdex':'cneds@fnedf.com',        'Laexly':'fev@fe.com',        'Fukc':'fexok@ver.com',        'Stifu':'stif@qq.com'} def Dumpfile(list):   

随机推荐