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

使用 pdb 来 debug 调试 python 程序

        使用 pdb(Python Debugger)是 python 自带的,即内置的调试工具。调试 Python 源代码时,掌握基础命令和高级技巧可以大幅提高调试效率。以下是 全面的技术总结和高级技巧,涵盖从基础到进阶的调试方法。

被调试源码:

a.py

radius =1while radius < 4:  area = 3.1415926 * radius**2print(f"radius is {radius}") print(f"circle area is {area}")radius += 1

1. 基础调试命令


(1) 使用 pdb


方式 1:命令行启动

$ python -m pdb a.py

程序会在第一行代码前暂停,进入调试模式。

注意:按照 python 的编程喜欢,这种方式简单,但不友好,会把import、def 都刷一遍,最后进入执行的代码处开始有价值的调试。

方式 2:代码中插入断点

import pdb; pdb.set_trace()  # Python 3.7+

程序运行到该行时会暂停,进入调试模式。

注意:其中 pdb.set_trace() 一般插在源代码程序的功能性开头处

方式 3:breakpoint()(Python 3.7+)

breakpoint()  # 等同于 import pdb; pdb.set_trace()

可以插入到功能性代码的开头一行


(2) 基本调试命令

命令缩写作用
helph查看所有命令帮助
nextn执行下一行(不进入函数)
steps进入函数调用
continuec继续执行直到下一个断点
listl显示当前代码上下文
printp打印变量值
quitq退出调试
returnr执行到当前函数返回


2. 高级调试技巧


(1) 条件断点

(Pdb) break filename.py:line_number, condition

示例:

(Pdb) break a.py:6, area > 5  # 当 area > 5 时在第 6 行暂停


(2) 查看调用栈(Backtrace)

(Pdb) where  # 或 `bt`

显示当前调用栈,帮助定位问题来源。

这里的示例比较简单,没有step 进子函数中去,但也能看出系统自带的函数调用栈:

(3) 修改变量值

(Pdb) !x = 42  # 修改变量 x 的值

在调试过程中动态调整变量值。

(4) 执行任意 Python 代码

(Pdb) import math
(Pdb) p math.sqrt(16)  # 计算并打印结果


可以在调试时执行任意 Python 表达式。

(5) 跟踪函数调用

(Pdb) display x  # 每次执行命令后自动打印 x 的值
(Pdb) undisplay  # 取消跟踪

 

3. 高级调试场景


(1) 调试异常

python -m pdb -c continue script.py


-c continue 让程序运行直到异常发生,然后进入调试模式。

(2) 调试多线程/多进程

import pdb
pdb.Pdb().set_trace()  # 适用于子进程调试

在子进程中手动设置断点。


(3) 调试异步代码(Async/Await)

import pdb
pdb.set_trace()  # 在 async 函数中使用

适用于 asyncio 调试。

4. 替代 pdb 的现代调试工具

工具特点
ipdb基于 IPython 的增强版 pdb,支持 Tab 补全
pdb支持语法高亮、更好的 UI
PyCharm Debugger图形化调试,支持条件断点
VS Code Debugger集成 IDE,可视化调试

 汇个总


基础命令:n(next)、s(step)、c(continue)、p(print)、l(list)。

高级技巧:

        条件断点 break filename:lineNumber , condition

        调用栈分析 where / bt

        动态修改变量 !x = 42

替代工具:ipdb、pdb++、PyCharm、VS Code。

 

http://www.lryc.cn/news/589424.html

相关文章:

  • I3C通信驱动开发注意事项
  • Linux715 磁盘管理:逻辑卷
  • golang二级缓存示例
  • 随机奖励能提升Qwen数学表现?本质是数据污染
  • NuGet01-安装及使用
  • Linux下编译海思WS63 SDK全攻略
  • 关于Linux下Cursor的使用
  • 如何设计实现开发自助重启工具-01-设计篇
  • 代码随想录八股文训练营总结
  • lesson14:Python的推导式
  • 2025-07-15 李沐深度学习6——Softmax回归
  • 项目:简单学生成绩管理系统设计
  • Nginx配置反向代理
  • 深入解析:磁盘级文件与内存级(被打开)文件的本质区别与联系
  • 脚手架新建Vue2/Vue3项目时,项目文件内容的区别
  • k8s环境使用Operator部署Seaweedfs集群(上)
  • 同济医院R语言训练营第三期开讲!上交大张维拓老师主讲
  • ubuntu22.04谷歌浏览器中文输入法bug
  • ASP .NET Core 8结合JWT轻松实现身份验证和授权
  • ESLint 配置错误:ReferenceError: prettier is not defined 解决方案
  • Vue 常用的 ESLint 规则集
  • 卫星通信链路预算之六:输出回退
  • web前端渡一大师课 01 事件循环
  • 网络基础协议综合实验
  • Spring MVC 执行流程详解:一次请求经历了什么?
  • Linux修改ssh默认端口,禁止root登录,禁止密码登录并同时开启公钥认证
  • session与cookie的区别
  • 深入掌握Python正则表达式:re库全面指南与实战应用
  • 编程项目选择思考点以及项目包装的关键点
  • : $ operator is invalid for atomic vectors