首页 > 代码库 > pdb-不需要IDE也能调试

pdb-不需要IDE也能调试

 python中有个pdb模块,使python代码也可以像gdb那样进行调试,一般情况下pdb模块可以在代码内直接使用,也可以通过命令行参数的形式添加该模块进行调试(python -m pdb file.py)。在代码中直接使用pdb模块调试时,import pdb模块后,然后在需要调试的代码出添加pdb.set_trace()命令即可,运行程序后,在运行到次代码处会自动停止,进入调试模式。

一般常用的调试命令有如下:

q  退出debug
h  打印可用的调试命令
b  设置断点,b 5 在第五行设置断点
h command  打印command的命令含义
disable codenum  使某一行断点失效
enable codenum   使某一行的断点有效
condition codenum xxx  针对断点设置条件
c    继续执行程序,直到下一个断点
n    执行下一行代码,如果当前语句有函数调用,则不会进入函数体中,当前行直接返回(单步跳过)
s    执行下一行代码,但是s会进入函数,并停在第一个能停的地方(相当于单步进入)
w    打印当前执行点的位置
j    codenum  让程序跳转到指定的行
l    列出附近的源码
p    打印一个参数的值 
a    打印当前函数及参数的值
回车  重复执行上一行

其中p 这个命令很关键,可以查看参数的值,很好!

测试代码如下sum.py:

#/usr/bin/python

def add_t( ):
    i=1
    sum=0
    for i in range(1,5):
        sum=sum+i
        print sum
if __name__ == __main__:
    add_t()

 

调试过程如下:python -m pdb sum.py

n调试

1 > /opt/sum.py(3)<module>()
  2 -> def add_t( ):
  3 (Pdb) n
  4 > /opt/sum.py(9)<module>()
  5 -> if __name__ == __main__:
  6 (Pdb) n
  7 > /opt/sum.py(10)<module>()
  8 -> add_t()
  9 (Pdb) n
 10 1
 11 3
 12 6
 13 10
 14 --Return--
 15 > /opt/sum.py(10)<module>()->None
 16 -> add_t()
 17 (Pdb) q

 

    n表示执行下一行代码,但是不陷入函数内部,可以看第3、6、9行,在执行add_t函数时并未陷入函数内部。

s调试

 

1 > /opt/sum.py(3)<module>()
  2 -> def add_t( ):
  3 (Pdb) s
  4 > /opt/sum.py(9)<module>()
  5 -> if __name__ == __main__:
  6 (Pdb) s
  7 > /opt/sum.py(10)<module>()
  8 -> add_t()
  9 (Pdb) s
 10 --Call--
 11 > /opt/sum.py(3)add_t()
 12 -> def add_t( ):
 13 (Pdb) s
 14 > /opt/sum.py(4)add_t()
 15 -> i=1
 16 (Pdb) s
 17 > /opt/sum.py(5)add_t()
 18 -> sum=0
 19 (Pdb) s
 20 > /opt/sum.py(6)add_t()
 21 -> for i in range(1,5):
 22 (Pdb) s
 23 > /opt/sum.py(7)add_t()
 24 -> sum=sum+i
 25 (Pdb) s
 26 > /opt/sum.py(8)add_t()
 27 -> print sum
 28 (Pdb) p i
 29 1
 30 (Pdb) p sum
 31 1
 32 (Pdb) s
 33 1
 34 > /opt/sum.py(6)add_t()
 35 -> for i in range(1,5):
 36 (Pdb) s
 37 > /opt/sum.py(7)add_t()
 38 -> sum=sum+i
 39 (Pdb) s
 40 > /opt/sum.py(8)add_t()
 41 -> print sum
 42 (Pdb) p i
 43 2
 44 (Pdb) p sum
 45 3
 46 (Pdb)

 

    s调试和n调试一样,只不过s在遇到函数时会进入函数进行调试,9、12、13表示进入add_t函数内部进行调试,后面使用p命令打印相关函数内参数的值,后面输入r即可退出函数内部的调试。

也可以在py文件里加pdb.set_trace()

例如:

import pdb

def make_bread():
    pdb.set_trace()
    return "I don‘t have time"

print(make_bread())

 

pdb-不需要IDE也能调试