使用 pdb 调试 Python 代码
# 引言
之前和同事做项目分享的时候了解过 pdb 的使用,但是因为感觉稍微有点复杂所以也没有很深入的时间学习。今年面试的时候又被问到线上调试,所以打算学习一下这个模块的使用。
按照 Real Python 的说法,使用 pdb 你可以查看应用程序中任何变量的状态。还可以在任何时候停止并恢复应用程序的执行流,这样就可以确切地看到每行代码如何影响其内部状态。
这对于跟踪难以发现的 bug 非常有用,并且允许您更快更可靠地修复错误代码。有时候,通过查看 pdb 中的代码并了解值是如何变化的,这会让人大开眼界,并且会有“顿悟”的时刻,偶尔还会看到🤦。
# 常用命令
命令 | 简写 | 作用 |
---|---|---|
args | a | 查看当前函数参数 |
break | b | 不加数字查看断点,加数字表示在某一行打断点 |
clear | cl | 清除所有断点,加数字表示清除第几个断点 |
continue | c | 运行程序直至遇到下一个断点 |
disable | 无 | 将指定的断点失效 |
display | 无 | 一直显示变量的值 |
enable | a | 将指定的断点生效 |
help | h | 查看帮助 |
ignore | 无 | 跳过断点 n 次 |
interact | 无 | 进入包含当前环境变量的 python 解析器 |
jump | j | 跳转到程序指定行 |
list | l | 列出周围 11 行代码,list 1,6 查看 1 到 6 行的代码 |
longlist | ll | 查看全部代码 |
next | n | 执行下一条语句(不进入函数) |
p | 无 | 输入表达式 |
pp | 无 | 格式化输出表达式 |
quit | q | 退出调试 |
restart | run | 重新启动 debug |
return | r | 执行当前运行函数到结束 |
step | s | 执行下一条步(进入函数) |
source | 无 | 获取对象(方法、类等)的源码 |
undisplay | 无 | 取消一直显示变量的值 |
until | unt | 执行直到某一行 |
whatis | 无 | 输出变量类型 |
where | w | 打印当前执行堆栈 |
参数 | 说明 | 示例 |
---|---|---|
h(elp) [command] | 帮助文档 | h b: 查看 b 命令的文档 |
l(ist) [first[, last]] | 列出当前或范围周围代码 | l 5, 20: 列出 5 到 20 行代码 l: 查看当前位置的代码 |
b(reak) [[ filename: ] lineno | function [, condition ]] | 打断点 |
w(here) | 查看当前执行的位置 | w |
tbreak [[ filename: ] lineno | function [, condition ]] | 设置临时断点,运行完毕后会删除这个断点 |
cl(ear) [filename:lineno | bpnumber [bpnumber ……]] | 清除断点 |
disable [bpnumber [bpnumber ……]] | 停用断点 | 用法和 cl 一样 |
enable [bpnumber [bpnumber ……]] | 启动断点 | 用法和 cl 一样 |
ignore bpnumber [count] | 忽略某个断点几次 | ignore 1 3:忽略断点列表中第 1 个断点 3 次,一般循环中用,可以查看下面 忽略断点示例 |
condition bpnumber [condition] | 给断点设置条件 | condition 1 i==4:当断点列表中第 1 个断点中变量 i 等于 4 的时候执行断点 |
commands [bpnumber] | 给断点写一个脚本执行 | 查看下面 断点脚本示例 |
s(tep) | 执行下一条命令,如果本句是函数调用,则 s 会执行到函数的第一句 | 示例参考下面的 s 执行效果示例 |
n(ext) | 执行下一条语句,如果本句是函数调用,则执行函数,接着执行当前执行语句的下一条。 | 示例参考下面的 n 执行效果示例 |
unt(il) | 执行到下一行 | 参考下面 unt 执行效果 |
r(eturn) | 执行当前运行函数到结束 | |
c(ontinue) | 继续执行,直到遇到下一条断点 | |
j(ump) lineno | 跳转至指定程序行(如果是前行,则忽略中间行代码。如果是后退,状态重设为回退行状态) | :是跳转到不是执行。示例:j 执行效果 |
a(rgs) | 显示当前所有变量 | |
p expression | 打印出当前所在函数中的变量或表达式结果 | p params:打印 params 参数 |
pp expression | 格式化打印出来的结果 | pp params:打印 params 参数 |
alias [name [command]] | 自定义一个函数,参数可由%1,%2 来表示,类似 Python 的 lambda | 用法参考 定义临时函数 |
unalias name | 删掉别名函数 | unalias name |
run [args ……] | 重新执行 | |
q | 退出 |
# 相关链接
- pdb --- Python 的调试器 — Python 3.10.4 文档 (opens new window)
- Python Debugging With Pdb – Real Python (opens new window)
- How to use the Python debugger (pdb) | Enable Sysadmin (opens new window)
- Python Debugger – Python pdb - GeeksforGeeks (opens new window)
- python pdb 代码调试 - 最全最详细的使用说明 - 简书 (opens new window)
- 如何使用 Pdb 调试 Python - konglingbin - 博客园 (opens new window)
- python 断点调试 PDB | FreezeJ' Blog (opens new window)
编辑 (opens new window)
上次更新: 2024-07-15, 03:27:09