深入理解inducer/pudb调试器的启动与使用技巧

深入理解inducer/pudb调试器的启动与使用技巧

什么是pudb

pudb是一个功能强大的Python调试器,提供了全屏、基于控制台的图形用户界面,让开发者能够更直观地进行代码调试。相比传统的pdb调试器,pudb提供了更丰富的可视化界面和更便捷的操作方式。

基本调试启动方式

代码中插入断点

在需要调试的代码位置插入以下任意一种形式的断点:

# 标准形式
from pudb import set_trace; set_trace()

# 简写形式1
import pudb; pu.db

# 简写形式2(当pudb已经导入时)
pu.db

对于Python 3.7及以上版本,可以通过设置环境变量来简化断点设置:

# 在~/.bashrc中添加
export PYTHONBREAKPOINT="pudb.set_trace"

然后在代码中直接使用:

breakpoint()  # 这会自动调用pudb

命令行启动方式

可以直接通过命令行启动调试:

python -m pudb my-script.py

这种方式特别适合在不同于安装pudb的Python环境中运行调试。

高级调试技巧

分离终端调试

当程序有多个线程输出到stdout导致终端混乱时,可以使用分离终端调试:

  1. 在新终端中执行tty命令获取终端路径(如/dev/pts/3
  2. 运行占位命令防止shell捕获输入:perl -MPOSIX -e pause
  3. 设置环境变量并启动调试:
PUDB_TTY=/dev/pts/3 pudb my-script.py

错误日志记录

将pudb内部错误记录到文件而非终端:

python -m pudb --log-errors pudberrors.log

远程调试功能

标准远程调试

  1. 在代码中设置远程断点:
from pudb.remote import set_trace
set_trace(term_size=(80, 24))  # 可指定终端大小
  1. 通过环境变量设置终端大小:
export PUDB_TERM_SIZE=80x24
  1. pudb会寻找空闲端口并等待telnet连接,终端会显示类似信息:
pudb:6899: Please start a telnet session using a command like:
telnet 127.0.0.1 6899
pudb:6899: Waiting for client...

主机和端口可以通过set_trace()参数或环境变量PUDB_RDB_HOSTPUDB_RDB_PORT指定。

反向远程调试

在反向模式下,pudb主动连接到监听端口:

  1. 首先使用netcat创建监听端口:
stty -echo -icanon && nc -l -p 6899  # Linux
stty -echo -icanon && nc -l 6899     # MacOS
  1. 在代码中设置反向调试:
from pudb.remote import set_trace
set_trace(reverse=True)
  1. 或通过环境变量启用:
export PUDB_RDB_REVERSE=1

特殊场景调试

调试fork后的进程

在fork的进程中,通常没有TTY附加到stdin/stdout,标准pudb会出错。可以使用:

PYTHONBREAKPOINT=pudb.forked.set_trace python script.py

与pytest集成

使用pudb调试pytest测试:

pytest --pdbcls pudb.debugger:Debugger --pdb --capture=no

注意必须添加--capture=no(或-s)参数,否则pytest会尝试自行管理标准流。

总结

pudb提供了多种灵活的调试方式,从基本的代码断点插入到高级的远程调试功能,能够满足各种复杂场景下的调试需求。通过掌握这些技巧,开发者可以更高效地进行Python代码调试,快速定位和解决问题。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仰钰奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值