深入探索Python中的PDB调试器:定位并解决代码问题

前言

还记得你是如何进行代码调试的吗?有人会说,我是添加一些输出语句,有人说,我是使用IDE自带的设置断点功能,当然都没有错,只是看哪个更合适,更能提升效率。但这都不是我们今天讲的重点,今天的重点是pdb

pdb重要吗?

当然很重要。前言中提到的打印,确实是调试程序的常用手段,但是这只局限于小型程序,如果对于一个很大的程序,那每次都要运行整个程序才能看到打印的值,显然是我们不能接受的。对于IDE提供的断点功能确实很方便,但是对于一些vim党来说就的另寻方案了。 Python 的 pdb,正是其自带的一个调试库。它为 Python 程序提供了交互式的源代码调试功能,是命令行版本的 IDE 断点调试器,完美地解决了我们刚刚讨论的这个问题。

pdb介绍

源码:Lib/pdb.py

pdb 模块定义了一个交互式源代码调试器,用于 Python 程序。它支持在源码行间设置(有条件的)断点和单步执行,检视堆栈帧,列出源码列表,以及在任何堆栈帧的上下文中运行任意 Python 代码。它还支持事后调试,可以在程序控制下调用。

如何使用pdb?

启动 PDB 调试器

要在 Python 代码中启动 PDB 调试器,需要在需要调试的代码行上加入 import pdb; pdb.set_trace() 代码。这样,在运行代码时,程序将会在此处暂停,并启动 PDB 调试器。

例如,以下代码演示了如何使用 PDB 调试器调试 Python 代码:

css 复制代码
import pdb
​
def add_numbers(a, b):
    pdb.set_trace()
    return a + b
​
result = add_numbers(5, 10)
print(result)

在执行以上代码时,当程序执行到 pdb.set_trace() 时,程序将会暂停,并启动 PDB 调试器。此时,你可以输入命令来查看变量、检查堆栈、单步执行代码等。

当然,还有另一种方式,像这样:

css 复制代码
def add_numbers(a, b):
    breakpoint()
    return a + b
​
result = add_numbers(5, 10)
print(result)

3.7 新版功能: 内置函数 breakpoint(),当以默认参数调用它时,可以用来代替 import pdb; pdb.set_trace()

如果你是想通过命令行来启动,当然也是支持的,像这样

复制代码
python3 -m pdb pdb_demo.py

基本的 PDB 命令

在 PDB 调试器中,有许多命令可以使用。以下是一些最常用的 PDB 命令:

  • n(ext):单步执行代码
  • s(tep):进入子函数或方法
  • r(eturn):执行代码直到当前函数返回
  • c(ontinue):继续执行代码直到下一个断点或程序结束
  • l(ist):显示当前代码段周围的源代码
  • p:打印变量的值
  • h(elp):查看帮助信息
  • b(reak): 设置断点。比如b 10,在第10行设置一个断点 。行号可以加上文件名和冒号作为前缀,以在另一个文件中设置一个断点。
  • c l(ear): 清楚断点
  • q(uit):退出调试器。 被执行的程序将被中止。
  • restart :重启被调试的 Python 程序。

使用 PDB 调试器调试 Python 代码

在使用 PDB 调试器调试 Python 代码时,以下是一些常用的技巧:

  • 在使用 n(ext)s(tep) 命令时,可以在命令后加上数字,以指定要执行多少次代码。例如,使用 n 3 命令将会执行下三行代码。
  • 在使用 l(ist) 命令时,可以在命令后加上代码行号,以指定要显示哪一段源代码。例如,使用 l 5,10 命令将会显示第 5 行到第 10 行的代码。
  • 在使用 p 命令时,可以打印表达式的值,并以逗号分隔打印多个表达式的值。例如,使用 p a, b, c 命令将会打印变量 a、b 和 c 的值。
  • 在使用 PDB 调试器时,你可以使用 ! 命令执行 Python 表达式。例如,使用 !a + b 命令将会计算 a + b 的值。

最后

在 Python 开发过程中,PDB 调试器是一个非常有用的工具,它可以帮助你快速定位和解决代码中的问题。除了这些常用命令,还有许多其他的命令可以使用,这里就不在一一赘述了。你可以参考对应的官方文档(docs.python.org/3/library/p...),来熟悉这些用法。

相关推荐
小蕾Java15 分钟前
PyCharm 软件使用各种问题 ,解决教程
ide·python·pycharm
Lucky_Turtle17 分钟前
【PyCharm】设置注释风格,快速注释
python
kunge1v534 分钟前
学习爬虫第四天:多任务爬虫
爬虫·python·学习·beautifulsoup
萧鼎44 分钟前
Python schedule 库全解析:从任务调度到自动化执行的完整指南
网络·python·自动化
EnCi Zheng1 小时前
SpringBoot 配置文件完全指南-从入门到精通
java·spring boot·后端
烙印6011 小时前
Spring容器的心脏:深度解析refresh()方法(上)
java·后端·spring
Lisonseekpan2 小时前
Guava Cache 高性能本地缓存库详解与使用案例
java·spring boot·后端·缓存·guava
B站_计算机毕业设计之家2 小时前
机器学习实战项目:Python+Flask 汽车销量分析可视化系统(requests爬车主之家+可视化 源码+文档)✅
人工智能·python·机器学习·数据分析·flask·汽车·可视化
羊羊小栈2 小时前
基于「多模态大模型 + BGE向量检索增强RAG」的航空维修智能问答系统(vue+flask+AI算法)
vue.js·人工智能·python·语言模型·flask·毕业设计
星期天要睡觉2 小时前
模型部署——Flask 部署 PyTorch 模型
pytorch·python·flask