我对直接使用pdb进行调试还比较陌生,目前在调试我的Django应用时遇到了一些问题。以下是我的操作:
python -m pdb manage.py runserver
(pdb) b core/views.py:22
Breakpoint 2 at /Users/raphaelcruzeiro/Documents/Projects/pdb_test/core/views.py:22
(Pdb) c
然而程序执行直接通过断点。我是否漏掉了某些命令?手册没有详细说明如何设置断点。
我对直接使用pdb进行调试还比较陌生,目前在调试我的Django应用时遇到了一些问题。以下是我的操作:
python -m pdb manage.py runserver
(pdb) b core/views.py:22
Breakpoint 2 at /Users/raphaelcruzeiro/Documents/Projects/pdb_test/core/views.py:22
(Pdb) c
然而程序执行直接通过断点。我是否漏掉了某些命令?手册没有详细说明如何设置断点。
我曾经遇到过同样的问题。
尝试使用类似 python -m pdb ./manage.py runserver --nothreading --noreload 127.0.0.1:8080
的命令,这对我解决了这个问题。
看起来 PDB 的断点是线程特定的,--nothreading
和 --noreload
选项是必需的,以避免某些分叉可能会混淆 PDB。这也是为什么 set_trace
起作用的原因,因为它直接在所需线程内部调用。
通常我宁可在源代码中使用set_trace()
,这样当添加/删除代码时,开发服务器将重新加载,而我不需要停止和重新启动它。例如:
def get_item(request):
import pdb; pdb.set_trace()
当访问视图时,pdb会启动。
过去我见过这个问题,通常是由于某人设置了断点在实际上并没有与运行的Python语句相连接的一行代码上。例如:空白行、注释行、多行语句的错误部分。
我在使用PyTorch编写神经网络时遇到了这个问题。与接受的答案类似,问题在于我的DataLoader创建了多个线程。移除num_workers
参数后,我可以在单个线程上进行调试。
train_loader = DataLoader(
train_dataset,
batch_size=batch_size,
num_workers=16, # <-------Remove this argument
pin_memory=True
)
pyproject.toml
配置来设置我的项目。在[tool.pytest.ini_options]
部分删除与覆盖率相关的pytest
设置解决了pdb无法按预期工作的问题。[tool.pytest.ini_options]
pyproject.toml
文件的[tool.pytest.ini_options]
部分中删除或注释掉与覆盖率相关的选项--cov-*
对我起到了作用。