如何使用 pdb 调试服务器上的代码

作者: iswbm / 发表于 2024-06-01 / 分类: Programming, Python

python

上一篇文章,讲的是 Pycharm 的远程调试,若你还没学会,可以点击这里进行查看。

超详细图文教你如何使用 PyCharm 进行远程调试

Pycharm 的图形化界面虽然好用,但是在某些场景中,是无法使用的。而 Python 本身已经给我们提供了一个调试神器 – pdb,可能你还不知道它,为了讲解这个神器,我写了这篇文章来帮助你轻松的理解它。

1. 准备文件

在调试之前先将这两个文件准备好(做为演示用),并放在同级目录中。

utils.py

def sum(mylist):
    result = 0
    for item in mylist:
        result += item
    return result

pdb_demo.py

import utils

def myfunc(mylist):
    result = utils.sum(mylist)
    print(result)


if __name__ == '__main__':
    print("----start----")
    myfunc([1,2,3,4])
    print("----end-----")

2. 进入调试模式

主要有两种方法

做为脚本调用,方法很简单,就像正常执行python脚本一样,只是多加了-m pdb

ptyhon -m pdb pdb_demo.py

使用这个方式进入调试模式,会在脚本的第一行开始单步调试。

对于单文件的脚本并没有什么问题,如果是一个大型的项目,项目里有很多的文件,使用这种方式只能大大降低我们的效率。

一般情况下,都会直接在你需要的地方打一个断点,那如何打呢?

只需在你想要打断点的地方加上这两行。

import pdb
pdb.set_trace()

然后执行时,也不需要再指定-m pdb了,直接python pdb_demo.py ,就会直接在这个地方暂停。

3. 调试指令

熟悉 Pycharm 的人都知道,我们执行下一步,执行到下一个断点是

同样的,pdb 也需要你更多记这样的命令。

当你看到pdb模式的标识符 (Pdb)时,就可以输入这样的命令。

我在这里将这些指令按使用频度分为三个等级。

最常用

指令 英文 解释
n Next 下一步
l list 列出当前断点处源码
p print 打印变量
s step into 执行当前行,可以进入函数
r return 运行完当前函数,返回结果
c continue 执行到下一断点或者结束
b break 设置断点
q quit 退出程序

有时使用

指令 英文 解释
a args 列出当前函数的参数
pp pprint 一种可视化更好的打印
j jump 跳到指定行
cl clear 清除断点
w where 打印当前堆栈
u up 执行跳转到当前堆栈的上一层
unt until 行数递增执行(忽略循环和函数)
ll longlist 列出更多的源码
run/restart run 重新启动 debug(-m pdb)

几乎不用

指令 英文 解释
tbreak temporary break 临时断点
disable 停用断点
enable 启用断点
alias 设置别名
unalias 删除别名
whatis 打印对象类型
ignore 设置忽略的断点
source 列出给定对象的源码

其上全部是我翻译自官方文档,原文在这里:https://docs.python.org/3/library/pdb.html

其实你大可不必死记这些命令,忘记的时候,只要敲入help并回车,就可以看所有的指令了。

4. 开始调试

这里就几个最常用的指定,来演示一遍。

这个调试过程,我加了些注释,你应该能够很轻易地理解这种调试方式。

今天pdb的调试内容大概就是这些,你学会了吗?

看到上面截图的时间了吧?是的,又是一个深夜写的文章。希望对你会有所帮助。

iswbm

作者

iswbm

云计算 & 容器 & 前后端研发工程师。喜欢探索新技术,空闲时也折腾 Logseq 等效率工具。 可以在 GitHub 关注我了解更多,也可以加我微信(stromwbm) 与我交流。