编程语言
首页 > 编程语言> > 调试python时Bdbquit引发了

调试python时Bdbquit引发了

作者:互联网

最近在将调试器添加到我的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,但无法弄清楚为什么会在我的代码中发生这种情况.任何人都可以向我提供一些为什么会发生这种情况的提示吗?我真的想让调试器再次运行.

解决方法:

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

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

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

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

标签:python,python-2-7,debugging,pdb,ipdb
来源: https://codeday.me/bug/20190930/1836836.html