PDB在断点处无法停止

30

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

然而程序执行直接通过断点。我是否漏掉了某些命令?手册没有详细说明如何设置断点。


没有任何异常。代码执行时就像没有调试器连接一样。 - Raphael
请您能否提供一小段代码来演示这个问题,而不仅仅是错误信息? - Michael Hoffman
6个回答

25

我曾经遇到过同样的问题。

尝试使用类似 python -m pdb ./manage.py runserver --nothreading --noreload 127.0.0.1:8080 的命令,这对我解决了这个问题。

看起来 PDB 的断点是线程特定的,--nothreading--noreload 选项是必需的,以避免某些分叉可能会混淆 PDB。这也是为什么 set_trace 起作用的原因,因为它直接在所需线程内部调用。


1
有没有其他模式(特别是测试)的想法?--nothreading似乎仅适用于runserver。 - Jeff Trull

12

通常我宁可在源代码中使用set_trace(),这样当添加/删除代码时,开发服务器将重新加载,而我不需要停止和重新启动它。例如:

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

当访问视图时,pdb会启动。


4
这个方案的问题在于它污染了源代码。 - Raphael
1
猜想这只是一个观点问题。无论如何,这只是在调试期间使用的语句,一旦调试会话结束,该语句就会被删除(此外,如果源代码已经被编辑过,也不需要记住断点位置或更新命令行)。 - mkriheli
当然,但我相信这个语句会被遗忘。我想要做的就是通过pdb设置一个简单的断点。这不应该很难,而且应该有更多关于这个工具的文档... - Raphael
好的,我的问题似乎比我想象的要大。我尝试了你提供的替代方法,但调试器仍然没有停止。只是为了确保,这是我正确调用 Django 应用程序的调试器方式吗?python -m pdb manage.py runserver - Raphael
1
我已经成功让PDB在set_trace处停下来了(由于某种原因,代码在编辑后没有自动重新加载)。不幸的是,我仍然无法让pdb在使用b命令创建的断点处停下来。 - Raphael
这个答案对我有用,但我更愿意使用用户友好的IDE,比如PyCharm社区版 https://www.jetbrains.com/pycharm/ - Mawg says reinstate Monica

4

过去我见过这个问题,通常是由于某人设置了断点在实际上并没有与运行的Python语句相连接的一行代码上。例如:空白行、注释行、多行语句的错误部分。


2
我注意到一个奇怪的事情是,当你重复按回车键时,PDB提示符会重复你之前的操作。此外,如果你在程序运行时按下回车键,PDB会缓冲输入并在提示符出现后应用它。在我的情况下,我正在使用PDB c(ontinue)运行程序。在初始化期间,我的程序将大量的调试信息写入stdout,所以我按了几次回车键,以便将已经写入的输出与触发断点后即将写入的输出分开。然后,当我通过某些外部操作触发断点时,PDB会停在断点处,但然后应用一个'buffered enter',重复了c(ontinue)操作。一旦我停止按回车键,它就开始正常工作了。
这可能听起来有些奇怪,我没有详细研究这个问题,但它为我解决了问题。也许它可以帮助其他人。

0

我在使用PyTorch编写神经网络时遇到了这个问题。与接受的答案类似,问题在于我的DataLoader创建了多个线程。移除num_workers参数后,我可以在单个线程上进行调试。

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

如果你遇到了这个问题,一个简单的解决方法是找出你的代码中使用了多进程的地方,并将其调整为只运行单个线程。

0
我使用了pyproject.toml配置来设置我的项目。在[tool.pytest.ini_options]部分删除与覆盖率相关的pytest设置解决了pdb无法按预期工作的问题。
[tool.pytest.ini_options]

pyproject.toml文件的[tool.pytest.ini_options]部分中删除或注释掉与覆盖率相关的选项--cov-*对我起到了作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接