zoukankan      html  css  js  c++  java
  • 如何用pdb进行python调试

    摘自 : http://www.91linux.com/html/article/program/python/20111119/22356.html

    本文章讲述了如何用pdb进行python调试讲解.
    当手边

    没有IDE,面对着python调试犯愁时,你就可以参考下本文;(pdb 命令调试)
    参 考:http://docs.python.org/library/pdb.html
    和 (pdb)help
    用pdb进行python调试,用法基本和gdb差不多,
    先看一个简单的例子:

    epdb1.py .# epdb1.py -- experiment with the Python debugger, pdb
    a = "aaa"
    b = "bbb"
    c = "ccc"
    final = a + b + c
    print (final)


    比如要对这个程序进行调试:
    1:在文件前面加上这一句,引入调试的模块。
    import pdb
    2:在要开始调试的一行加上pdb.set_trace()文件变成:

    # epdb1.py -- experiment with the Python debugger, pdb
    import pdb
    a = "aaa"
    pdb.set_trace()
    b = "bbb"
    c = "ccc"
    final = a + b + c
    print final


      可以运行这个程序,到断点出会停下来,和gdb类似,
    可以执行命令:
    直接回车是重复前一条命令!
    p(print) 查看一个变量值
    n(next) 下一步
    s(step) 单步,可进入函数
    c(continue)继续前进
    l(list)看源代码



    用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
    importpdb
    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>断点设置
    (Pdb)b10 #断点设置在本py的第10行
    或(Pdb)bots.py:20 #断点设置到 ots.py第20行
    删除断点(Pdb)b #查看断点编号
    (Pdb)cl 2 #删除第2个断点
    >运行
    (Pdb)n #单步运行
    (Pdb)s #细点运行 也就是会下到,方法
    (Pdb)c #跳到下个断点
    >查看
    (Pdb)p param #查看当前 变量值
    (Pdb)l #查看运行到某处代码
    (Pdb)a #查看全部栈内变量 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)com pareLog()
    -> 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),退出调试

    ==============================================================================================
    在python中使用pdb模块可以进行调试
    import pdb
    pdb.set_trace()

    也可以使用python -m pdb mysqcript.py这样的方式

    (Pdb) 会自动停在第一行,等待调试,这时你可以看看 帮助
    (Pdb) h
    说明下这几个关键 命令

    >断点设置
    (Pdb)b 10 #断点设置在本py的第10行
    或(Pdb)b ots.py:20 #断点设置到 ots.py第20行
    删除断点(Pdb)b #查看断点编号
    (Pdb)cl 2 #删除第2个断点

    >运行
    (Pdb)n #单步运行
    (Pdb)s #细点运行 也就是会下到,方法
    (Pdb)c #跳到下个断点
    >查看
    (Pdb)p param #查看当前 变量值
    (Pdb)l #查看运行到某处代码
    (Pdb)a #查看全部栈内变量
    (Pdb)w 列出目前call stack 中的所在层。
    (Pdb)d 在call stack中往下移一层
    (Pdb)u 在call stack中往上移一层。如果在上移一层之后按下 n ,则会在上移之后的一层执行下一个叙述,之前的 function call 就自动返回。
    (Pdb)cl 清除指定的断点。如果没有带参数,则清除所有断点。
    (Pdb)disable 取消所有断点的功能,但仍然保留这些断点。
    (Pdb)enable 恢复断点的功能。
    (Pdb)ignore 设定断点的忽略次数。如果没指定 count,其初始 为 0。当 count 为 0 时,断点会正常动作。若有指定 count,则每次执行到该中断, count 就少 1,直到 count 数为 0。
    (Pdb)condition bpnumber [condition]
    (Pdb)j(ump) lineNo. 跳到某行执行。只有在 call stack 的最底部才能作用。
    (Pdb)l 列出目前所在档案中的位置。连续地 l 命令会一直列到档案结尾,可以使用指定行数或范围来打印。
    (Pdb)pp 和 p 命令类似,但是使用 pprint module(没用过 pprint,详情请参考 Python Library Reference)。
    (Pdb)alias 以一个"别名"代替"一群除错命令",有点类似 c/c 的 macro(详情请参考 Python Library Reference)。
    (Pdb)unalias 取消某个 alias。
    (Pdb)[!]statement 在目前的环境(context)中执行叙述。

  • 相关阅读:
    MySQL正则表达式 REGEXP详解
    INSERT DELAYED 句法
    mysql查询语句分析 explain用法
    mysql导出导入
    sf04_操作系统中 heap 和 stack 的区别
    2.4 Rust Ownership
    2.1 GO 变量定义
    1.3 IDAE 中使用GO开发项目
    my30_表碎片整理
    my29_PXC集群状态查看
  • 原文地址:https://www.cnblogs.com/ftm-datablogs/p/5394964.html
Copyright © 2011-2022 走看看