实际工作过程中都是采用linux远程ssh模式进行无界面开发,代码出问题需要调试,一般有两种解决方案
- 使用
print("")
控制开输出信息 - 使用log.debug(“”),写日志到控制台或则文件
然而但是这些通过修改源码的方式,侵入性太高,每次调试完可能还要删除,比较麻烦,那么我们就需要一个能够进行无侵入式的调试方式
简介
pdb是ptyhon内置的一个调试库,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。
开启调试方式
- 侵入式方法 (需要在被调试的代码中添加以下代码然后再正常运行代码)
import pdb
pdb.set_trace()
- 非侵入式方法 (不用额外修改源代码,在命令行下直接运行就能调试)
python -m pdb demo.py
为了不修改源码,我们推荐第一种非侵入方案
简单使用
- 待调试代码
demo.py
print(111)
print(222)
a = 1
b = 2
c = a + bfor i in range(100, 106):print("index:", i)print("hello")
- 进入调试
python -m pdb demo.py
d:\>python -m pdb demo.py
> d:\demo.py(1)<module>()
-> print(111)
-> 表示当前要执行的位置
- 查看代码
执行ll
命令查看代码
可以看到所有的代码,以及->
指向当前要执行的代码行
(Pdb) ll1 -> print(111)2 print(222)3 a = 14 b = 25 c = a + b67 for i in range(100, 106):8 print("index:", i)9 print("hello")
(Pdb)
- 执行下一行
执行n
命令,进入下一行,可以看到命令行打印出当前要执行的行的代码-> print(222)
(Pdb) n
111
> d:\demo.py(2)<module>()
-> print(222)
(Pdb) ll1 print(111)2 -> print(222)3 a = 14 b = 25 c = a + b67 for i in range(100, 106):8 print("index:", i)9 print("hello")
(Pdb)
- 设置断点
执行b 3
命令,给第3行设置断点,可以看到第三行多了一个大写的B
(Pdb) b 3
Breakpoint 1 at d:\demo.py:3
(Pdb) ll1 print(111)2 -> print(222)3 B a = 14 b = 25 c = a + b67 for i in range(100, 106):8 print("index:", i)9 print("hello")
- 查看所有断点
执行b
命令,查看所有断点
(Pdb) b
Num Type Disp Enb Where
1 breakpoint keep yes at d:\demo.py:3
(Pdb)
- 删除断点
执行clear 1
命令,删除Num
为1的第一个断点
(Pdb) clear 1
Deleted breakpoint 1 at d:\demo.py:3
(Pdb) ll1 print(111)2 -> print(222)3 a = 14 b = 25 c = a + b67 for i in range(100, 106):8 print("index:", i)9 print("hello")
- 下一个断点
先给第三行和第七行打上断点,然后执行c命令,可以看到代码执行到第三行,再次执行c命令,代码执行到第七行
(Pdb) b 3
Breakpoint 2 at d:\demo.py:3
(Pdb) b 7
Breakpoint 3 at d:\demo.py:7
(Pdb) ll1 print(111)2 -> print(222)3 B a = 14 b = 25 c = a + b67 B for i in range(100, 106):8 print("index:", i)9 print("hello")
(Pdb) c
222
> d:\demo.py(3)<module>()
-> a = 1
(Pdb) c
> d:\demo.py(7)<module>()
-> for i in range(100, 106):
- 查看变量值
使用p a
命令,查看a的值,执行p b,c
查看b,c的值
(Pdb) p a
1
(Pdb) p b,c
(2, 3)
(Pdb)