50

最近在将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,但无法弄清楚为什么会在我的代码中发生这种情况。谁能给我一些提示,说明为什么会发生这种情况?我真的想让调试器再次工作。

4

7 回答 7

22

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

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

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

于 2018-02-10T10:46:50.147 回答
15

如果您从(pdb)提示符继续并允许您的代码正常完成,我不希望像您指示的回溯那样输出,但是如果您pdb使用quit命令或 ^D (EOF) 退出,则会发生类似的回溯,因为没有任何内容捕获BdbQuit调试器退出时引发的异常。In由方法(以及各种运行方法中的子句)bdb.py self.quitting设置为。when is调用的调度方法,典型的for子句是简单的语句;从 . 继承所有这些。Trueset_quitfinallytrace_dispatch raise BdbQuitself.quittingTrueexcept:BdbQuitpasspdbgdb

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

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

您可以pdb通过pdb将脚本调用作为其命令行参数的命令或使用python -m pdb.

于 2016-01-21T23:47:17.133 回答
14

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

于 2019-01-29T11:31:32.637 回答
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/

无论如何,您的问题缺乏急需的背景。请补充您的问题。

于 2018-03-07T03:36:32.563 回答
1

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

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

示例: 在此处输入图像描述

于 2021-11-26T12:49:19.803 回答
0

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

于 2020-08-20T07:43:53.867 回答
0

我有更多的运气使用pdbpp,这是替代的下降pdb,即 in 不需要任何其他东西,而不是本身(没有插件,没有额外的配置/选项)。它支持自动完成,这就是我使用ipdb.

您可以使用pip install pdbpp.

于 2021-09-24T19:37:18.197 回答