24

我对直接使用 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

然而,执行直接通过断点。我错过了一些命令吗?该手册不再详细说明如何设置断点。

4

5 回答 5

23

我也遇到过同样的问题。

尝试类似的东西python -m pdb ./manage.py runserver --nothreading --noreload 127.0.0.1:8080。它为我解决了这个问题。

似乎 PDB 的断点是特定于线程的,并且--nothreading--noreload选项对于避免一些可能混淆 PDB 的分叉是必要的。这也是set_trace有效的原因,因为它直接在感兴趣的线程中调用。

于 2015-02-02T11:52:50.360 回答
9

我通常更喜欢set_trace()源本身,这样开发服务器将在添加/删除时重新加载,我不需要停止并重新启动它。例如:

def get_item(request):
   import pdb; pdb.set_trace()

当视图被访问时,pdb 将启动。

于 2011-10-01T00:49:46.733 回答
4

当我过去看到这个问题时,通常是因为有人在实际上没有连接到正在运行的 Python 语句的行上设置了断点。例如,空行、注释行、多行语句的错误部分。

于 2011-10-27T19:12:27.647 回答
2

我注意到的一件奇怪的事情是,当您反复按 Enter 键时,PDB 提示符会重复您之前的操作。此外,如果您在程序运行时按 Enter,PDB 会缓冲输入并在出现提示时应用它。就我而言,我正在使用 PDB c(ontinue) 运行一个程序。我的程序在初始化期间将大量调试信息写入标准输出,因此我按了几次 Enter 以将已经写入的输出与触发断点后将要写入的输出分开。然后,当我通过一些外部操作触发断点时,PDB 将在断点处停止,但随后应用重复 c(ontinue) 操作的“缓冲输入”。一旦我停止输入,它就开始正常工作。

这听起来可能有点奇怪,我没有对这个问题进行太多调查,但它为我解决了这个问题。也许它可以帮助别人。

于 2015-11-03T13:45:56.273 回答
0

我在 PyTorch 中编写神经网络时遇到了这个问题。与接受的答案类似,问题是我的 DataLoader 分离了多个线程。删除num_workers参数允许我在单个线程上进行调试。

    train_loader = DataLoader(
        train_dataset,
        batch_size=batch_size,
        num_workers=16, # <-------Remove this argument
        pin_memory=True
    )

如果您遇到此问题,一个简单的修复方法是跟踪您在代码中使用多处理的位置,并将其调整为运行单个线程。

于 2020-12-09T18:09:23.840 回答