深入理解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导致终端混乱时,可以使用分离终端调试:
- 在新终端中执行
tty
命令获取终端路径(如/dev/pts/3
) - 运行占位命令防止shell捕获输入:
perl -MPOSIX -e pause
- 设置环境变量并启动调试:
PUDB_TTY=/dev/pts/3 pudb my-script.py
错误日志记录
将pudb内部错误记录到文件而非终端:
python -m pudb --log-errors pudberrors.log
远程调试功能
标准远程调试
- 在代码中设置远程断点:
from pudb.remote import set_trace
set_trace(term_size=(80, 24)) # 可指定终端大小
- 通过环境变量设置终端大小:
export PUDB_TERM_SIZE=80x24
- 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_HOST
和PUDB_RDB_PORT
指定。
反向远程调试
在反向模式下,pudb主动连接到监听端口:
- 首先使用netcat创建监听端口:
stty -echo -icanon && nc -l -p 6899 # Linux
stty -echo -icanon && nc -l 6899 # MacOS
- 在代码中设置反向调试:
from pudb.remote import set_trace
set_trace(reverse=True)
- 或通过环境变量启用:
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),仅供参考