2016-01-21 112 views
11

,当最近添加调试到我的蟒蛇2.7.10代码时提出,我得到这个消息:Bdbquit调试蟒蛇

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 

这是插入线后:

import pdb; pdb.set_trace()

在代码。

我想不通为什么发生这种情况。我已经阅读了Bdb和Bdbquit,但无法弄清楚为什么在我的代码中发生这种情况。任何人都可以提供一些为什么会发生这种情况的暗示吗?我想想让调试器再次工作。

+3

你如何运行你的过程?我的猜测是你的程序没有附加到终端或类似的东西。这是一个子进程或类似的东西? – shx2

+0

@ shx2,子流程?莫名其妙地使用[Luigi](https://pypi.python.org/pypi/luigi)会导致这种情况吗? –

回答

6

如果从(pdb)提示继续,让你的代码正常完成,我不会期望像您指定的追踪输出,但如果你退出pdb,与quit命令或^ d(EOF),回溯就像发生这种情况一样,因为调试器退出时引发的异常BdbQuit没有任何结果。在bdb.pyself.quitting得到由set_quit方法(以及通过在各种运行方法finally子句)设置为True。当self.quittingTrue时,trace_dispatchraise BdbQuit调用的调度方法,而BdbQuitexcept:子句是典型的pass语句; pdb继承了gdb的全部内容。

总之,异常处理时使用调试器相互作用早期完成来禁用调试器使用的系统跟踪功能。完全避免该回溯

一种方法是使用pdb不同。而不是从你的代码中调用pdb.set_trace()(而不是处理BdbQuit在所有),你可以内pdb调用你的代码(而不是相反),在该点的意图来PDB的BdbQuit异常将被处理。这也将允许您在不修改代码的情况下选择断点位置(使用pdbbreak命令)。或者你可以混合两种方法;根据pdb,pdb.set_trace()调用和所有调用您的代码,这些调用将是只能通过修改代码才能删除的断点。

您可以在pdb之内使用pdb命令并将脚本调用作为其命令行参数或使用python -m pdb来调用您的代码。

+0

如果您可以指定BdbQuit的可能原因,因为pdb不会在某些脚本中引发它,那将会很棒。 – Alex

+0

这不是完整的答案,'pdb'还有很多其他的局限性,就像它不能在多进程池中工作一样等等。你没有提到这些。 –

-1

我就遇到了这个时候我离开import pdb和我的生产代码pdb.set_trace()。基本上什么也没有c继续代码,所以它最终错误了。我觉得自己像个笨蛋。

0

除了富勒的Eirik答案,我想补充一点,你不能在那东西运行在不同的进程可以用pdb。对于调试,你可以检查这个答案:https://stackoverflow.com/a/23654936/7806805,但它看起来很骇人,或者你可以让你的程序运行在一个单一的线程。请参阅文档:https://docs.python.org/3/library/concurrent.futures.html。对于多问题,你甚至可能想通过https://www.reddit.com/r/learnpython/comments/46x9sm/why_is_pdbset_trace_crashing_whenever_it_is_in_an/

反正你的问题缺乏急需的方面。请添加到您的问题。