1.简介
对于开发者来说,一个好用的debug工具可以快速准确的定位程序问题,python的dubug方式大概可以归为3类:
1).print,log大法:初级选手,输出直观但不够灵活
2).ide debug:功能强大,但服务器命令行上调试不行
3).pbd,PySnooper:高级选手,功能强大而且灵活(PySnooper使用虽然简单,但输出信息过于冗余)
本文主要讲活好话少的pyhton自带debug神器--pdb。
2.pdb使用
pdb常用命令 :
命令 | 英文含义 | 中文含义 | 使用频率 |
n | next | 执行下一条语句 | 极高 |
l | list | 列出源码 | 极高 |
s | step | 进入函数 | 极高 |
r | return | 执行当前运行函数到结束 | 极高 |
a | args | 列出当前执行函数的参数 | 极高 |
p | 打印变量值(也可用pp) | 极高 | |
unt | until | 执行到下一行(跳出循环),或者当前堆栈结束 | 高 |
c | continue | 继续执行,直到遇到下一条断点 | 高 |
u | up | 执行跳转到当前堆栈的上一层(和s互逆) | 极高 |
q | quit | 退出 | 极高 |
pdb使用方式:
1).命令行方式
举个例子:
def func(x, y):
k = 10
z = 1
for i in range(k):
z += (x + y) * i
return z
def main():
x, y = 1, 2
z = func(x, y)
print(z)
if __name__ == '__main__':
main()
python -m pdb pdb_test.py
这种方式程序会自动打断点,断点位置为程序代码文本顺序最上边。此时pdb会在第一行def func(x, y):处打断点.
Macbook:script m$ python -m pdb pdb_test.py
> /Users/m/data/script/pdb_test.py(23)<module>()
-> def func(x, y):
(Pdb)
2).程序导入pdb包方式
举个例子:
import pdb
def func(x, y):
k = 10
z = 1
for i in range(k):
z += (x + y) * i
z += 20
return z
def main():
pdb.set_trace()
x, y = 1, 2
z = func(x, y)
print(z)
if __name__ == '__main__':
main()
Macbook:script m$ python pdb_test.py
> /Users/m/data/script/pdb_test.py(15)main()
-> x, y = 1, 2
(Pdb) n
> /Users/m/data/script/pdb_test.py(16)main()
-> z = func(x, y)
(Pdb) s
--Call--
> /Users/m/data/script/pdb_test.py(4)func()
-> def func(x, y):
(Pdb) n
> /Users/m/data/script/pdb_test.py(5)func()
-> k = 10
(Pdb) n
> /Users/m/data/script/pdb_test.py(6)func()
-> z = 1
(Pdb) n
> /Users/m/data/script/pdb_test.py(7)func()
-> for i in range(k):
(Pdb) n
> /Users/m/data/script/pdb_test.py(8)func()
-> z += (x + y) * i
(Pdb) n
> /Users/m/data/script/pdb_test.py(7)func()
-> for i in range(k):
(Pdb) unt
> /Users/m/data/script/pdb_test.py(8)func()
-> z += (x + y) * i
(Pdb) l
3
4 def func(x, y):
5 k = 10
6 z = 1
7 for i in range(k):
8 -> z += (x + y) * i
9 z += 20
10 return z
11
12
13 def main():
(Pdb) r
--Return--
> /Users/m/data/script/pdb_test.py(10)func()->156
-> return z
(Pdb) u
> /Users/m/data/script/pdb_test.py(16)main()
-> z = func(x, y)