当前位置: 首页 > web >正文

python进阶: 深入了解调试利器 Pdb

Python是一种广泛使用的编程语言,以其简洁和可读性著称。在开发和调试过程中,遇到错误和问题是不可避免的。Python为此提供了一个强大的调试工具——Pdb(Python Debugger)

PdbPython标准库中自带的调试器,可以帮助开发者跟踪代码执行、查看变量值、设置断点等功能。


1. 启动 pdb 调试

方法一:命令行启动
python -m pdb your_script.py

程序会从第一行开始暂停,进入 pdb 调试模式。

方法二:代码中插入断点

在需要调试的位置插入以下代码:

import pdb; pdb.set_trace()  # Python 3.7+ 可简写为 breakpoint()

运行脚本时,程序会在 pdb.set_trace() 处暂停。


2. 常用命令

命令简写说明
nextn执行下一行(不进入函数内部)
steps进入函数内部
continuec继续执行,直到下一个断点或程序结束
listl显示当前代码位置周围的代码
printp打印变量值,例如 p variable
breakb设置断点,例如 b 10(第10行)或 b function_name
wherew显示当前调用栈(即程序执行到此处的位置路径)
returnr执行到当前函数返回
quitq强制退出调试
helph查看命令帮助

3. 高级用法

条件断点
b 20, condition  # 在第20行设置条件断点,当条件满足时暂停
# 示例:b 10, x > 5  # 当变量 x 大于5时在第10行暂停
修改变量
p x = 10  # 在调试时修改变量 x 的值为10
查看命令历史

Enter 键可重复执行上一个命令。


4. 示例调试流程

假设有以下脚本 demo.py

def add(a, b):result = a + breturn resultx = 5
y = 10
import pdb; pdb.set_trace()  # 在此处暂停
total = add(x, y)
print(total)

调试步骤:

  1. 运行脚本,程序在 pdb.set_trace() 处暂停。
  2. 输入 n 执行下一行(此时 total = add(x, y) 还未执行)。
  3. 输入 s 进入 add 函数内部。
  4. 输入 p result 查看 result 的值。
  5. 输入 c 继续执行,直到程序结束。

5. pdb.pm的使用

pdb.pm()Python 调试器 pdb 中一个非常有用的功能,它用于在程序抛出异常(未被捕获的异常)后,自动进入调试模式,并定位到异常发生的堆栈帧(即错误发生的具体位置)。

def divide(a, b):return a / b
try:result = divide(5, 0)
except Exception as e:import pdb; pdb.pm()  # 捕获异常后手动进入调试

6. 小技巧

  • 交互式执行:在调试过程中可以直接输入变量名或表达式,例如直接输入 x 查看其值。
  • 断点管理:使用 break 查看所有断点,clear 删除断点。
  • 跳过代码块:用 until 跳出循环(例如 until 15 执行到第15行)。

通过 pdb 可以逐步跟踪代码逻辑,检查变量状态,快速定位问题。熟练后可以结合 IDE 的图形化调试工具(如 VS Code、PyCharm)提升效率。

http://www.xdnf.cn/news/304.html

相关文章:

  • 第R3周:RNN-心脏病预测
  • namesapce、cgroup
  • kubeadm极速部署Kubernetes 1.26.X 版本集群
  • AI语音助手 React 组件使用js-audio-recorder实现,将获取到的语音转成base64发送给后端,后端接口返回文本内容
  • 【学习笔记】文件上传漏洞--黑白盒审计
  • 数字友好战略视域下数字安全核心要素的理论解构与实践路径
  • 2022年世界青年科学家峰会-高端装备系统动力学与智能诊断维护学术研讨会
  • Java之this关键字
  • CTF--MD5
  • 慢速率拉伸热变形工艺试验机
  • 关于模拟噪声分析的11个误区
  • Dify快速入门之基于知识库构建聊天机器人
  • 汽车免拆诊断案例 | 2019款大众途观L车鼓风机偶尔不工作
  • 在浏览器中输入 URL 到页面加载完成都做了什么
  • 【含文档+PPT+源码】基于python爬虫的豆瓣电影、音乐、图书数据分析系统
  • nginx-基础知识(二)
  • 为什么计算「网络响应时间」或「定位响应时间」时,CACurrentMediaTime() 比 Date() 更优?
  • MCP系列之架构篇:深入理解MCP的设计架构
  • DeepSeek 操作 MySQL 数据库:使用 MCP 实现数据库查询
  • 【HDFS入门】联邦机制(Federation)与扩展性:HDFS NameNode水平扩展深度解析
  • 【AI提示词】儿童看护员
  • 实验五 内存管理实验
  • 如何在PDF.js中改造viewer.html以实现PDF的动态加载
  • STM32单片机入门学习——第41节: [12-1] Unix时间戳
  • MyBatis如何配置数据库连接并实现交互?
  • YOLOv5、YOLOv6、YOLOv7、YOLOv8、YOLOv9、YOLOv10、YOLOv11、YOLOv12的网络结构图
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(7):(1)ながら 一边。。一边 (2)。。。し。。。し。。 又……又……
  • Vue3后代传祖先组件通讯方法
  • BGP基础实验
  • DeepSeek-R3、GPT-4o 与 Claude-3.5-Sonnet 全面对比:性能、应用场景与技术解析