本文用于介绍pdb的使用方式和使用场景.
PS1: 下文每个小标题里的小括号是指令的别名,中括号里的数字表示该指令的使用频率或重要程度(1表示经常使用,2表示有时使用,3表示偶尔使用,4表示一般不用).
PS2: 本文教程基于Python3
如何进入Pdb调试模式
修改代码
import pdb
pdb.set_trace()
模块启动进入
python -m pdb test.py
想要进入python的pdb调试模式主要有两种方法.一是修改代码,在需要停下来的地方加入pdb.set_trace()
语句,当程序运行到这句话的时候就会自动停下来进入调试模式.二是在启动脚本的时候使用python -m pdb test.py
的方式,这样的话,程序会在test.py的第一句话就停下来.
第一种方式,一般用在确认了问题出在哪里之后,相当于直接在那里设了一个断点.第二种方式则是从头开始调试,但第二种方式可以实现第一种方式(断点+c,设置断点在那个地方,然后让程序继续执行),并且下文会介绍第二种方式更多有用的手法.
要注意的是,程序运行的时候,pdb有可能在后台监控.如果pdb在后台监控的时候程序发生错误,则程序会停下来进入pdb模式,此时可以执行查看命令找出问题,但不能让程序继续执行了.如果pdb不在后台监控,则程序发生错误会直接结束python进程.
使用第一种方式的话,pdb会在执行到pdb.set_trace()
之后才会在后台监控,而第二种方式,一开始pdb就会在后台监控.
对于不清楚程序是否出错,使用第二种方式会更好,因为当程序抛出异常,程序就会停下来进入调试模式,你可以通过查看变量找出问题所在,而不需要重新运行一次程序.第二种方式的不好之处在于,它在程序结束的时候会进入调试模式,准备重新运行程序,并且不会释放内存或显存.
基本控制流
n(next)[1]
n
执行当前行
s(step)[1]
s
执行当前行,如果是函数的话会进入函数
c(continue)[1]
c
继续运行
r(return)[1]
r
继续运行到当前函数返回
q(quit)[1]
q
退出程序
调试最重要的是找到出错的地方,而n,s,c,r,q
就是在找出出错的代码时最常用的指令.
n
和s
,要注意的是,n
和s
都是单步进行,执行当前行,但如果当前行是一个函数(或者说不是