调试python时Bdbquit引发了

isa*_*ess 22 python debugging python-2.7 pdb ipdb

最近在将调试器添加到我的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
Run Code Online (Sandbox Code Playgroud)

这是在插入行之后:

import pdb; pdb.set_trace()

在代码中.

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

Eir*_*ler 11

如果你从(pdb)提示继续并允许你的代码正常完成,我不希望输出像你指示的跟踪,但是如果你退出pdb,使用quit命令或^ D(EOF),会发生类似这样的回溯,因为没有任何结果捕获BdbQuit调试器退出时引发的异常.在由方法bdb.py self.quitting设置的get中(以及各种run方法中的子句).调度方法,通过所谓的当是,典型的条款是一个简单的声明; 继承了所有这些.Trueset_quitfinallytrace_dispatch raise BdbQuitself.quittingTrueexcept:BdbQuitpasspdbgdb

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

完全避免回溯的一种方法是使用pdb不同的方法.您可以在内部调用代码(而不是反之亦然),而不是pdb.set_trace()从您的代码调用(而不是处理),此时异常将按照pdb的意图处理.这也将允许您在不修改代码的情况下选择断点位置(使用's 命令).或者你可以混合使用这两种方法; 运行代码,调用和所有代码,这些调用将是只能通过修改代码才能删除的断点.BdbQuitpdbBdbQuitpdbbreakpdbpdb.set_trace()

您可以pdb使用pdb命令将脚本调用作为其命令行参数,或使用,来调用代码python -m pdb.

  • 这不是完整的答案,`pdb` 还有许多其他限制,比如它不能在多进程池中工作等等。你没有提到这些。 (2认同)

tee*_*ane 6

我就遇到了这个时候我离开import pdbpdb.set_trace()在我的生产代码。当pdb.set_trace()执行该行时,python正在等待我的输入来告知它继续执行c或介入等操作……因为python代码是由Web服务器调用的,所以我没有在那里按下来c继续。这么长时间(不确定多长时间)后,它终于引发了BdbQuit异常。

我没有任何设置可以捕获该异常,因此它在我的Web服务器中提高了500。

我花了一段时间才了解到我在守护程序/后台运行的调试代码是造成此问题的原因。我觉得很傻。

  • 更新了我对投反对票的人的回答。如果您投反对票,请重新阅读答案并解释为什么这不能回答问题。 (2认同)

Ish*_*ava 6

除了 Eirik Fuller 的回答之外,我想补充一点,你不能pdb在不同进程中运行的东西中使用。为了调试,你可以检查这个答案:/sf/answers/1655845551/,但它看起来很黑客,或者你可以让你的程序在单线程中运行。请参阅文档: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/

无论如何,你的问题缺乏非常需要的背景。请补充您的问题。


Siv*_*ash 5

一种可能的原因是您正在运行Python script in the background。当某个进程在后台运行时,您将无法通过终端将输入发送到该进程,因此pdb控制台将无法正常工作。最终,它引发了bdbquit。