
python代码调试神器-pdb
一、背景:
在Linux服务器上或者docker中,没有现成的ide环境,遇到问题如何调试呢,我们平时的做法可能是找到某个疑问点,在其后面打出print语句输出到终端,这种方式固然可行,
但会存在如下弊端:
1、有的对象不能被直接打印输出
2、如果print输出的值是符合预期的,那么还要寻找其他可疑点继续print
3、print出来后发现终端debug的信息太多了,容易被覆盖,还要在前面加个“=====”作区分
4、尤其是当用docker swarm或其他编排工具部署服务以后,调试代码把人累死。
二、pdb介绍
pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。
pdb 提供了一些常用的调试命令:
命令 |
解释 |
---|---|
break 或 b 设置断点 | 设置断点 |
continue 或 c | 继续执行程序 |
list 或 l | 查看当前行的代码段 |
step 或 s | 进入函数 |
return 或 r | 执行代码直到从当前函数返回 |
exit 或 q | 中止并退出 |
next 或 n | 执行下一行 |
pp | 打印变量的值 |
w | 打印堆栈信息 |
a | 打印函数参数值 |
help | 帮助 |
三、使用示例
随便找一个python脚本,在上面导入包import pdb,并在代码关键位置写pdb.set_trace()
直接python命令执行该脚本,那么走到set_trace的这一行代码会停住,并进入pdb调试模式,在种模式下我们不仅可以查看输出任意变量的值还可以配合pdb的命令作进一步的代码调试:
按w打印堆栈信息:
按a打印所处函数的参数信息(断点当前示例函数:
按l查看上下文代码:
直接打印变量的值或者类型:
按n执行下一行:
按s进入put_action函数:
按c继续下一个断点或者结束
示例中的断点是打在while循环里的,所以c相当于continue了。
按q退出pdb调试:
另外pdb还提供一种非侵入式的方式调试代码,即不需要改动原程序,直接python3 -m pdb filename.py并配合命令使用,这种笔者不常用,不作过多介绍,
有兴趣可以查阅相关资料。
pdb中文文档:https://docs.python.org/zh-cn/3/library/pdb.html
四、全部命令
import pdb
直接在代码里需要调试的地方放一个pdb.set_trace()
n 执行下一条语句
w where 打印当前执行堆栈
d down 执行跳转到在当前堆栈的深一层
u up 执行跳转到当前堆栈的上一层
b break 添加断点
tbreak:(temporary break)临时断点
在第一次执行到这个断点之后,就自动删除这个断点,用法和b一样
cl clear 清楚断点
disable:停用断点,参数为bpnumber,和cl的区别是,断点依然存在,只是不启用
enable:激活断点,参数为bpnumber
s step 执行下一条命令 如果本句是函数调用,则s会执行到函数的第一句
r return 执行当前运行函数到结束
c continue 继续执行,直到遇到下一条断点
l list 列出源码 看下面代码
longlist 所有源吗
ll 查看当前函数的代码
a args 列出当前执行函数的函数
run 重新启动debug 相当于restart
q quit 退出debug
j jump 设置下条执行的语句函数 只能在堆栈的最底层跳转,向后重新执行,向前可直接执行到行号
unt:(until)执行到下一行(跳出循环),或者当前堆栈结束
conditon,给断点设置条件,当参数condition返回True的时候bpnumber断点有效,否则bpnumber断点无效
直接输入Enter,会执行上一条命令;
直接使用 p 变量名 查看值 print
pp 好看一点的 打印
bt 调用查看的堆栈
alias 查看所有命令别名和对应命令 相当于配置 ls 为 l
unalias 取消命名
whatis 查看类型
where 查看所在的位置
interact 启用交互式解释器
retval 打印函数的最后一次返回的返回值。
source 尝试获取给定对象的源代码并显示它。
display 每次在当前帧中停止执行时,显示表达式的值
undisplay 在当前帧中不再显示该表达式。如果没有表达式,请清除当前帧的所有显示表达式。
debug 输入一个递归调试器,它逐步遍历code参数(这是要在当前环境中执行的任意表达式或语句)。
ignore 设置给定断点号的忽略计数。如果忽略count,则忽略计数将设置为0。当忽略计数为零时,断点将变为活动状态。如果为非零值,则每次达到断点且不禁用断点时,计数都会递减,并且任何关联条件的评估结果为true。
commands 为断点设置一个新条件,该表达式必须在接受断点之前求值为true。如果条件不存在,任何现有的条件被移除; 即,将断点设为无条件
更多推荐









所有评论(0)