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

调试效果图:配置流程:

results matching ""

    No results matching ""