Python Debugpy 是做什么的?
当 Python 代码需要交互式调试时使用:隐藏的局部变量、令人困惑的状态变更、失败的测试、子进程、长时间运行的服务,或远程/无头附加。
选择能到达问题帧的最小调试器。
选择
breakpoint():本地代码,允许修改源码,最快路径。python3 -m pdb:无需修改源码,从头启动。python3 -m pdb -c continue:在未捕获异常处停止。debugpy:远程/无头进程、DAP 客户端、已运行的 PID,或服务启动竞态。
命令
python3 -m pdb path/to/script.py arg1
python3 -m pdb -c continue path/to/script.py
python3 -c "import debugpy" || python3 -m pip install debugpy
python3 -m debugpy --listen 127.0.0.1:5678 --wait-for-client path/to/script.py
python3 -m debugpy --listen 127.0.0.1:5678 --wait-for-client -m package.module
python3 -m debugpy --listen 127.0.0.1:5678 --pid <pid>
通过修改源码附加:
import debugpy
debugpy.listen(("127.0.0.1", 5678))
debugpy.wait_for_client()
debugpy.breakpoint()
事后检查:
import pdb, sys
try:
run()
except Exception:
pdb.post_mortem(sys.exc_info()[2])
raise
pdb
- 流程:
n、s、r、c、q。 - 堆栈/源码:
w、u、d、a、l、ll。 - 值:
p expr、pp expr、display expr。 - 断点:
b file.py:42、b func、b file.py:42, condition、cl <num>。 - 修改/求值:
!statement;完整 REPL:interact。
规则
- 先用最小的命令/测试复现问题。
- 为 pdb 禁用并行测试工作进程;交互式 stdin 通常会在工作池内中断。
- 将
debugpy保留在激活的虚拟环境中;除非项目已经需要它,否则不要将其添加为项目依赖。 - 将调试服务器绑定到
127.0.0.1;除非环境隔离或通过隧道访问,否则不要暴露0.0.0.0。 - 为并行会话使用唯一的端口。
debugpy --pid会注入到正在运行的进程中;附加前确认目标 PID。- 如果在 Linux 上 PID 附加失败,先检查 ptrace/容器权限,再修改目标。
- 提交前清理:
rg -n 'breakpoint\(|pdb\.set_trace|debugpy\.' --type py。 - 在无调试器的情况下重新运行正常的项目测试/门禁。
PYTHONBREAKPOINT=0可禁用breakpoint()。- 如果进程在调试器分离后卡住,请确认它没有停在断点处。