PDB不会停在断点

问题描述:

我很直接用pdb进行调试,而且我在调试我的Django应用程序时遇到了一些问题。这是我在做什么:PDB不会停在断点

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

没有例外。代码只是执行好像没有附加调试器 – Raphael

+0

您能否请您发布一小段代码来演示此问题,而不仅仅是错误消息? –

我已经经历过同样的问题。

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

似乎PDB断点是线程特定的,并且--nothreading--noreload选项是必要的,以避免可能会混淆PDB的某些分支。这也是为什么set_trace有效,因为它直接在感兴趣的线程内调用。

+0

任何想法如何在其他模式下做到这一点(特别是测试)? - 非线程似乎只是运行服务器。 –

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

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

当视图访问,PDB会踢

+2

这个替代方案的问题是它污染了源代码 – Raphael

+0

猜猜这是一个意见问题。无论如何,它只是在调试过程中,当调试会话结束后,该语句当然会被删除(另外,如果源案例已被编辑过,则不需要记住哪里中断,或更新命令行)。 – mkriheli

+0

当然,但有一个伟大的瑞克我相信这个声明将被遗忘。我想要的只是通过pdb设置一个简单的断点。它不应该这么难,应该有更多的工具文档... – Raphael

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

我注意到的一件奇怪的事情是,当您重复点击回车时,PDB提示重复您之前的操作。而且,如果您在程序运行时按下Enter键,PDB将缓冲输入并在出现提示后应用。就我而言,我正在使用PDB c(ontinue)运行程序。我的程序在初始化过程中为stdout编写了很多调试信息,所以我输入了几次来分隔已经写入的输出和一旦触发断点就写入的输出。然后,当我通过一些外部动作触发断点时,PDB将停止在断点处,然后应用重复c(ontinue)动作的'缓冲输入'。一旦我停止输入,它就开始正常工作。

这听起来有点奇怪,我没有调查过这个问题,但它解决了我的问题。也许它可以帮助别人。