python调试之pdb


一、PDB调试命令

pdb调试命令
完整命令 简写命令 描述
args a 列出当前函数的参数
**break** **b <行号>** **在某一行设置断点**
**break** **b <文件名>:<行号>** **在某个文件的某行打一点断点**
**break** **b <函数名>** **在某个含税的第一行打一个断点**
**clear** **cl** **清除所有断点**
**clear** **cl n1 n2** **清除编号为n1、n2的断点**
condition 设置条件断点
disable 禁用断点
enable 启用断点
help h 查看pdb帮助
**next** **n** **执行下一条语句,遇到函数不进入其内部**
**step** **s** **执行下一条语句,遇到函数会进入其内部**
**continue** **c或者cont** **执行到下一个断点**
ignore 忽略断点
jump j 跳转到指定行数运行
**list** **l** **列出源码(前后11行代码)**
**list** **l <行号>** **列出某行周围11行代码(即这一行为中间行,列出它上下各5行)**
**list** **l <行号1> <行号2>** **列出两个行号范围内的代码**
**p** **p** **打印变量值,也可以用print**
**pp** **pp** **好看一点的输出**
**quit** **q** **退出 pdb**
return r 一直运行到函数返回
tbreak 设置临时断点,断点只中断一次
where w 打印当前执行堆栈(查看所在的位置)
! 在pdb中执行语句

二、关键命令

1.断点设置
(Pdb) b 10  # 断点设置在本py的第10行
(Pdb) b test.py:20  # 断点设置到 test.py第20行

2.删除断点
(Pdb) b  # 查看断点编号
(Pdb) cl 2  # 删除第2个断点

3.运行
(Pdb) n  # 单步运行
(Pdb) s  # 细点运行 也就是遇到函数、方法会进入里面
(Pdb) c  # 跳到下个断点

4.查看
(Pdb) p param  # 查看当前 变量值
(Pdb) l  # 查看运行到某处代码
(Pdb) a  # 查看全部栈内变量

5.打印变量
(Pdb)p param # 如果变量是个复杂的对象,可以先打印查看变量的属性,然后查看变量的某个属性值 (Pdb)p dir(param) (Pdb)p param.xxx

三、调试示例

1、示例1

1.代码示例
import pdb
s1 = 'aaa'
pdb.set_trace()
s2 = 'bbb'
s3 = 'ccc'
pdb.set_trace()
s = s1 + s2 + s3
print(s)

可以看到上面代码使用pdb.set_trace()函数打了两个断点(第4、7行)


2.开始调试
执行上面代码就进入了调试状态:
> d:\projects\pythonprojects\3.25pdb\test.py(4)<module>()
-> s2 = 'bbb'  # -> 表示执行到了这里,但是还没有真正执行,因此此时的s2仍未被赋值
(Pdb) 

可以看出直接执行到了第一个断点所在的下一行,并停在了这里。
这时可以执行命令: n 进行下一步:
(Pdb) n
> d:\projects\pythonprojects\3.25pdb\test.py(5)<module>()
-> s3 = 'ccc'  # -> 表示执行到了这里,但是还没有真正执行,因此此时的s3仍未被赋值,但前面的代码都执行了
(Pdb) 

使用 p <变量名> 命令打印已经出现过的变量的值:
(Pdb) p s1
'aaa'
(Pdb) p s2
'bbb'
(Pdb) p s3
*** NameError: name 's3' is not defined
(Pdb) 
因为当前变量s3还没有被赋值,所以打印s3的时候提示 NameError 异常。


使用 l 命令打印出当前的代码段:
(Pdb) l 
      1      import pdb
      2      s1 = 'aaa'
      3      pdb.set_trace()
      4      s2 = 'bbb'
      5  ->    s3 = 'ccc'
      6      pdb.set_trace()
      7      s = s1 + s2 + s3
      8      print(s)

    退出调试: q 命令
    Traceback (most recent call last):
      File "D:/Projects/PythonProjects/3.25pdb/test.py", line 5, in <module>
        s3 = 'ccc'
      File "D:/Projects/PythonProjects/3.25pdb/test.py", line 5, in <module>
        s3 = 'ccc'
      File "C:\Python\Python36\lib\bdb.py", line 51, in trace_dispatch
        return self.dispatch_line(frame)
      File "C:\Python\Python36\lib\bdb.py", line 70, in dispatch_line
        if self.quitting: raise BdbQuit
    bdb.BdbQuit

2、示例2

QuickStart中使用的调试方式不够优雅,因为是通过修改代码的方式打断点的,用起来不太方便。
那么下面我们使用动态打断点的方式进行调试

1.代码示例
s1 = 'aaa'
s2 = 'bbb'
s3 = 'ccc'
s = s1 + s2 + s3
print(s)


2.开始调试
1,在终端输入命令执行脚本文件:python -m pdb test2.py
> d:\projects\pythonprojects\3.25pdb\test2.py(1)<module>()
-> s1 = 'aaa'
(Pdb) l
  1  -> s1 = 'aaa'
  2     s2 = 'bbb'
  3     s3 = 'ccc'
  4     s = s1 + s2 + s3
  5     print(s)
[EOF]

2,可以看到当前代码中我们还没有打任何断点,代码默认停在了第1行。
执行一个命令 n :
(Pdb) n
> d:\projects\pythonprojects\3.25pdb\test2.py(2)<module>()
-> s2 = 'bbb'
(Pdb) l
  1     s1 = 'aaa'
  2  -> s2 = 'bbb'
  3     s3 = 'ccc'
  4     s = s1 + s2 + s3
  5     print(s)
[EOF]
可以看到单步执行到了下一行。

3,如果我们想在第4行打一个断点,用 b <行号> 命令在某一行打一个断点:
(Pdb) b 4
Breakpoint 1 at d:\projects\pythonprojects\3.25pdb\test2.py:4
(Pdb) n
> d:\projects\pythonprojects\3.25pdb\test2.py(3)<module>()
-> s3 = 'ccc'
(Pdb) l
  1     s1 = 'aaa'
  2     s2 = 'bbb'
  3  -> s3 = 'ccc'
  4 B   s = s1 + s2 + s3
  5     print(s)
[EOF]

这样就成功地在第4行打了一个断点。

4,查看当前打了哪些断点: b 命令
(Pdb) b
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at d:\projects\pythonprojects\3.25pdb\test2.py:4

四、补充

在命令行中进入调试模式的方法: python -m pdb demo.py
在调试模式中按一下 Enter 键表示执行一下上一条命令。


原文链接:https://www.cnblogs.com/Zzbj/p/10592278.html