【问题标题】:BdbQuit raised when debugging Python with pdb使用 pdb 调试 Python 时引发 BdbQuit
【发布时间】:2016-01-21 03:05:41
【问题描述】:

最近在将 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

这是插入行之后:

import pdb; pdb.set_trace()

在代码中。

我无法弄清楚为什么会这样。我已经阅读了 Bdb 和 Bdbquit,但无法弄清楚为什么会在我的代码中发生这种情况。谁能给我一些提示,说明为什么会发生这种情况?我真的想让调试器再次工作。

【问题讨论】:

  • 您如何运行您的流程?我的猜测是您的进程没有连接到终端或类似的东西。这是一个子流程还是类似的东西?
  • @shx2,子进程?以某种方式使用Luigi 会导致这种情况吗?
  • 我遇到了the same issue。真心希望能解决

标签: python python-2.7 debugging pdb ipdb


【解决方案1】:

我在生产代码中留下import pdbpdb.set_trace() 时遇到了这个问题。当pdb.set_trace() 行被执行时,python 正在等待我的输入告诉它continue 或进入等等......因为python 代码正在被Web 服务器调用,所以我没有按@ 987654325@ 继续。经过这么长时间(不确定多长时间),它终于引发了BdbQuit 异常。

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

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

【讨论】:

  • 更新了我对投反对票的人的回答。如果您投了反对票,请重新阅读答案并解释为什么这不能回答问题。
  • 你到底是怎么做到的?
  • @AbhishekRai 您是否尝试在生产环境中运行 PDB?我认为您需要做的不是在生产中运行它并从您的代码中删除 pdf.set_trace()。
  • 还是不明白..那怎么调试呢?
【解决方案2】:

如果您从(pdb) 提示符继续并允许您的代码正常完成,我不希望输出像您指示的回溯,但如果您退出pdb,使用quit 命令或^D ( EOF),这样的回溯会发生,因为没有什么可以捕获调试器退出时引发的BdbQuit 异常。在bdb.py 中,self.quitting 通过set_quit 方法(以及各种运行方法中的finally 子句)设置为True。当self.quittingTruetrace_dispatchraise BdbQuit调用的调度方法,BdbQuit的典型except:子句是一个简单的pass语句; pdb 继承了 gdb 的所有内容。

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

完全避免这种回溯的一种方法是以不同的方式使用pdb。您可以在pdb 中调用您的代码(而不是反之亦然),而不是从您的代码中调用pdb.set_trace()(并且根本不处理BdbQuit),此时BdbQuit 异常将按预期处理数据库。这也将允许您在不修改代码的情况下选择断点位置(使用pdbbreak 命令)。或者您可以混合使用这两种方法;在pdbpdb.set_trace() 调用和所有调用下运行您的代码,这些调用将成为断点,您只能通过修改代码来删除。

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

【讨论】:

  • 如果您可以指定 BdbQuit 的可能原因,那就太好了,因为 pdb 不会在某些脚本中引发它。
  • 这不是完整的答案,pdb 还有许多其他限制,比如它不能在多进程池中工作等等。你没有提到那些。
  • 使用python -m pdb 运行(即使在python 3.7 中)仍然会遇到这个问题。
  • 感谢您的回答!这实际上是 99% 来这里的人最有可能出错的地方。就我而言,我通过 STDIN 将输入管道输入到 Python 进程。这会导致 pdb 调试器立即读取 EOF,因此立即读取 BadQuit
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    除了 Eirik Fuller 的回答之外,我想补充一点,您不能在其他进程中运行的东西中使用 pdb。对于调试,你可以检查这个答案:https://stackoverflow.com/a/23654936/7806805 但它看起来很hackish,或者你可以让你的程序在一个线程中运行。查阅文档: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/

    无论如何,您的问题缺乏急需的上下文。请补充您的问题。

    【讨论】:

      【解决方案5】:

      你可以使用命令docker-compose run --rm --service-ports {YOUR_CONTAINER} 添加后:

      def your_f():
          **import pdb
          pdb.set_trace()**
          result = your_logic
          return result
      

      示例:

      【讨论】:

      • 谢谢!但是我使用了撰写服务名称而不是容器名称而不是 --service-ports
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        我在使用 pdbpp 时遇到了更多的运气,它是 pdb 的替代品,即 in 不需要任何其他东西(不需要插件,不需要额外的配置/选项)。它支持自动补全,这就是我使用ipdb 所追求的。

        您可以使用pip install pdbpp 安装它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-29
          • 2023-03-27
          • 1970-01-01
          • 2015-12-30
          相关资源
          最近更新 更多