使用pdb调试Python时引发的BdbQuit

使用pdb调试Python时引发的BdbQuit,python,python-2.7,debugging,pdb,ipdb,Python,Python 2.7,Debugging,Pdb,Ipdb,最近,在将pdb调试器添加到我的Python 2.7.10代码中时,我收到以下消息: Traceback (most recent call last): File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/queues/connectors/amqplib_connector.py", line 191, in acking_callback call

最近,在将
pdb
调试器添加到我的Python 2.7.10代码中时,我收到以下消息:

Traceback (most recent call last):
  File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/queues/connectors/amqplib_connector.py", line 191, in acking_callback
    callback(message.body)
  File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/queues/consumable_message_queue.py", line 32, in deserialized_callback
    self._callback_method(msg)
  File "/Users/isaachess/Programming/vivint/Platform/BusinessLogic/businesslogic/util/statsd_util.py", line 95, in _time_func
    retVal = f(*args, **kwargs)
  File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/net/router.py", line 226, in handle
    try:
  File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/net/router.py", line 226, in handle
    try:
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bdb.py", line 49, in trace_dispatch
    return self.dispatch_line(frame)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bdb.py", line 68, in dispatch_line
    if self.quitting: raise BdbQuit
BdbQuit
这是在插入行之后:

导入pdb;pdb.set_trace()

在代码中


我不明白为什么会这样。我已经阅读了Bdb和BDBguit,但无法理解为什么我的代码中会出现这种情况。有谁能给我一些提示,说明为什么会发生这种情况?我真的很想让调试器重新工作。

如果您继续从
(pdb)
提示符下运行,并允许代码正常完成,我不希望得到您指示的回溯输出,但是如果您退出
pdb
,使用
退出
命令或^D(EOF),发生这样的回溯是因为在调试器退出时,没有任何东西可以捕获引发的
bdbguit
异常。在
bdb.py
self.quitting
中,通过
set\u quit
方法(以及各种运行方法中的
finally
子句)将退出设置为
True
。当
self.quitching
True
时,
trace\u Dispatch
调用的分派方法是
raise bdbquiit
,而
bdbquiit
的典型
除外:
子句是一个简单的
pass
语句
pdb
继承了
gdb
的所有内容

简而言之,当调试器交互提前完成时,异常处理用于禁用调试器使用的系统跟踪功能

一种完全避免回溯的方法是以不同的方式使用
pdb
。您可以在
pdb
中调用代码,而不是从代码中调用
pdb.set_trace()。这还允许您选择断点位置,而无需修改代码(使用
pdb
break
命令)。或者你可以混合这两种方法;在
pdb
pdb.set_trace()
调用和所有调用下运行代码,这些调用将是断点,您只能通过修改代码来删除


您可以在
pdb
中调用代码,方法是使用
pdb
命令,将脚本调用作为其命令行参数,或者使用
python-m pdb
在生产代码中退出
import pdb
pdb.set_trace()
时遇到此问题。当执行
pdb.set_trace()
行时,python正在等待我的输入,告诉它继续或进入,等等。。。因为python代码被web服务器调用,所以我没有按
c
继续。经过这么长时间(不确定多长时间),它最终引发了
bdbguit
异常

我没有任何设置来捕获该异常,因此它在我的web服务器中引发了一个500


我花了一段时间才明白,我在守护进程/后台运行的调试代码导致了这个问题。我觉得自己很傻。

除了Eirik Fuller的回答,我想补充一点,您不能在另一个进程中运行的东西中使用
pdb
。对于调试,您可以检查这个答案:但是它看起来非常粗糙,或者您可以让您的程序在单个线程中运行。请参阅文档:。对于多处理问题,您甚至可能希望通过


无论如何,你的问题缺乏必要的背景。请补充你的问题

一个可能的原因是您正在后台运行
Python脚本。当进程在后台运行时,您无法通过终端向进程发送输入,因此pdb控制台无法工作。最终,它提出了bdbquit

对于那些在Django测试中遇到这种情况的人,可能是将
--parallel
标志传递给test命令造成的。正如前面的答复中指出的那样,这是由于多重处理造成的。请尝试删除该标志,看看它是否解决了问题,它为我解决了问题。

您如何运行流程?我的猜测是,您的进程没有连接到终端或类似的东西。这是子流程还是类似的?@shx2,子流程?不知何故,使用原因是什么?我遇到了。我真的希望它能被解决。如果你能指定BdbQuit的可能原因,那就太好了,因为pdb在某些脚本中没有提出它。这不是完整的答案,pdb还有许多其他限制,比如它不能在多进程池中工作等等。你没有提到这些。我更新了我对谁投了反对票的回答。如果你投了反对票,请重新阅读答案,并解释为什么这并没有回答问题。