我是直接使用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
然而,执行直接通过断点。我错过了一些命令吗?本手册不再详述设置断点了。
答案 0 :(得分:16)
我遇到了同样的问题。
尝试python -m pdb ./manage.py runserver --nothreading --noreload 127.0.0.1:8080
之类的内容。它为我解决了这个问题。
似乎PDB的断点是线程特定的,--nothreading
和--noreload
选项是必要的,以避免一些可能混淆PDB的分叉。这也是set_trace
工作的原因,因为它直接在感兴趣的帖子中调用。
答案 1 :(得分:8)
我通常更喜欢源代码中的set_trace()
,这样开发服务器在添加/删除时会重新加载,我不需要再次停止并重新启动它。例如:
def get_item(request):
import pdb; pdb.set_trace()
访问视图时,pdb将启动。
答案 2 :(得分:2)
当我在过去看到这个问题时,通常是因为有人将断点设置在一条实际上没有连接到运行的Python语句的行上。例如,空行,注释行,多行语句的错误部分。
答案 3 :(得分:1)
我注意到的一个奇怪的事情是,当您反复按Enter键时,PDB提示会重复您之前的操作。此外,如果在程序运行时按Enter键,PDB将缓冲输入并在出现提示时应用它。就我而言,我正在使用PDB c(ontinue)运行程序。我的程序在初始化期间向stdout写了很多调试信息,所以我点击输入几次将已经写入的输出与触发断点时将要写入的输出分开。然后,当我通过一些外部动作触发断点时,PDB将在断点处停止,但随后应用一个“缓冲”输入'它重复了c(ontinue)动作。一旦我停止按下输入,它就开始正常工作。
这可能听起来有点奇怪,我还没有多少调查这个问题,但它解决了我的问题。也许它可以帮助别人。
答案 4 :(得分:0)
在PyTorch中编写神经网络时遇到了这个问题。与接受的答案类似,问题在于我的DataLoader拆分了多个线程。删除num_workers
参数使我可以在单个线程上进行调试。
train_loader = DataLoader(
train_dataset,
batch_size=batch_size,
num_workers=16, # <-------Remove this argument
pin_memory=True
)
如果遇到此问题,一个简单的修复方法是跟踪您在代码中使用多处理的位置,并将其调整为运行单个线程。