1.3 PDB断点调试
目录:
- 断点调试和PDB调试
- PDB调试流程
- 代码实例和命令表
- 在sublime text 3利用插件实现PDB调试
为什么需要断点调试?
- 精准判断问题,没有断点情况下,只能通过自带运行报错,或者插入print查值来调试程序
- python默认提供了一个库用来进行调试,就是pdb库了。
使用基本流程?
- 导入包:import pdb
- 在代码特定位置,设置断点:pdb.set_trace()
执行程序,程序运行到断点位置,开始进入交互调试模式
根据自己目的,使用常用PDB命令,进行操作。
实例
以下Demo程序,我们在[ a = 8 ]这个位置插入断点。然后执行程序。
# -*-coding:utf-8 -*-
#! /usr/bin/python
def ab(a,b):
d = 0
c = a + b
return c
xxx = 6
print xxx
"""
1、程序从头执行,然后遇到断点位置,进入调试模式(交互)。
2、调试模式可以干什么?
- 查看当前运行位置: list
- 执行下一行代码: n
- 查看某个变量值:p
- 默认执行位置遇到函数调用,是不进入函数的,需要进入则,s进入
- 如果进入函数内,可以 r 直接跳到return位置
- 如果想直接连续执行,则 c ,c直接跳到下一个断点(如果有),要不就是程序执行结束
- 可以在调试模式下增加新的断点: b 查看断点,或者 b + 行号 设置新断点
- 可以查看帮助 help
- 增加临时变量 !ccc = 1000
"""
# 设置第一个断点
import pdb; pdb.set_trace() # breakpoint 51eb2baf //
a = 8
f = ab(1,6)
g = ab(2,8)
print "XXXXXX"
print "CCCCC"
c = 10000
# 设置第二个断点
import pdb; pdb.set_trace() # breakpoint fcf0e958 //
c = 10
print ab(5,8)
print "xxx"
执行程序的终端效果。
6 # 输出6说明程序是从头运行,只是到断点位置开始进入调试模式。
> /Users/yanggan/Desktop/test111.py(18)<module>()
-> a = 8 # 表示现在准备运行的位置
(Pdb) list # 手动查看准备执行的代码
13
14
15 # 设置第一个断点
16 import pdb; pdb.set_trace() # breakpoint 51eb2baf //
17
18 -> a = 8
19 f = ab(1,6)
20 g = ab(2,8)
21
22 print "XXXXXX"
23 print "CCCCC"
(Pdb) p
*** SyntaxError: SyntaxError('unexpected EOF while parsing', ('<string>', 0, 0, ''))
(Pdb) p a # 打印 a 出错,说明现在--> a = 8 还没执行。
*** NameError: NameError("name 'a' is not defined",)
(Pdb) n # 执行代码,调到下一行,现在程序已经执行 a=8 ,可以a的值了
> /Users/yanggan/Desktop/test111.py(19)<module>()
-> f = ab(1,6)
(Pdb) p a # a的值现在已经是8l了
8
(Pdb) n # 继续执行这一行【f=ab(a,6)】,跳到下一行
> /Users/yanggan/Desktop/test111.py(20)<module>()
-> g = ab(2,8) # 跳到这里说明程序是不进入函数里面,只是执行,那么我们可以按 s 进入函数
(Pdb) list
15 # 设置第一个断点
16 import pdb; pdb.set_trace() # breakpoint 51eb2baf //
17
18 a = 8
19 f = ab(1,6)
20 -> g = ab(2,8)
21
22 print "XXXXXX"
23 print "CCCCC"
24 c = 10000
25
(Pdb) step # 进入函数,就是 ab(2,8) 函数里面
--Call--
> /Users/yanggan/Desktop/test111.py(4)ab()
-> def ab(a,b):
(Pdb) list # 打印位置
1 # -*-coding:utf-8 -*-
2 #! /usr/bin/python
3
4 -> def ab(a,b):
5 d = 0
6 c = a + b
7 return c
8
9
10 xxx = 6
11 print xxx
(Pdb) n # 执行到下一行
> /Users/yanggan/Desktop/test111.py(5)ab()
-> d = 0
(Pdb) p a,b # 打印传过来参数的值
(2, 8)
(Pdb) r # 直接连续执行,直到return c 的位置
--Return--
> /Users/yanggan/Desktop/test111.py(7)ab()->10
-> return c
(Pdb) p c # 打印c的值,前一行已经执行,所以c的值是有的
10
(Pdb) list
2 #! /usr/bin/python
3
4 def ab(a,b):
5 d = 0
6 c = a + b
7 -> return c
8
9
10 xxx = 6
11 print xxx
12
(Pdb) n # 继续执行到下一行。
> /Users/yanggan/Desktop/test111.py(22)<module>()
-> print "XXXX
调试模式命令参考
pdb终端会显示文件名, 行号,当前文件, 下一行指令等信息.并等待用户指令:
c / continue: 继续执行, 直至进程完成或被断点阻塞
n / next: 执行下一条指令, 若遇函数直接得到函数返回值, 不进入
s / step: 步进执行下一条指令,若遇函数则进入执行
r / return: 跳出当前函数, 返回调用栈的上一层
b / breakpoint [<line_num>] : 在指定行(下一条指令处)设置一个断点:b, b 5
a / args: 显示当前函数的参数
q / exit: 中止进程执行
l / list: 显示下一条指令所在的代码块
pp <obj_name>: 显示某个对象的值
disable / enable <line_num>: 禁用/启用某行上的断点
condition [<line_num>] <condition>: 在指定行上设置条件断点.如:condition 5 i==3
!<expr>: 动态执行一条语句, 可以是赋值等指令: !i=2, !1==1.
Sublime Text 3借用插件实现PDB调试
在没有插件的情况下,我们在ST里面也能实现PDB调试,就是导入pdb包,然后手动设置,借用插件,可以拥有更好的调试体验。
需要的插件:
1、Python Breakpoint ,作用:可以直接在想要的位置,按快捷键,直接插入断点,实际上就是省了2步
【import pdb; pdb.set_trace()】 # breakpoint 51eb2baf //
2、 SublimeREPL, 作用:在st编辑器里面执行向执行终端一样的效果。
插件安装使用package control包管理攻击直接下载即可。packagecontrol使用参看:https://packagecontrol.io/installation
调试效果图:配置流程:
- 1、 安装这两个插件:插件安装使用package control包管理攻击直接下载即可。packagecontrol使用参看:https://packagecontrol.io/installation
- 2、使用python breakpoint插件的快捷键[
ctrl+shift+b
]在代码插入断点。具体使用参看:https://packagecontrol.io/packages/Python Breakpoints - 3、使用sublimeREPL的Python执行代码,在编辑器内模拟终端调试程序。具体查看:https://sublimerepl.readthedocs.io/en/latest/