使用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还有许多其他限制,比如它不能在多进程池中工作等等。你没有提到这些。我更新了我对谁投了反对票的回答。如果你投了反对票,请重新阅读答案,并解释为什么这并没有回答问题。