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.
我就遇到了这个时候我离开import pdb和pdb.set_trace()在我的生产代码。当pdb.set_trace()执行该行时,python正在等待我的输入来告知它继续执行c或介入等操作……因为python代码是由Web服务器调用的,所以我没有在那里按下来c继续。这么长时间(不确定多长时间)后,它终于引发了BdbQuit异常。
我没有任何设置可以捕获该异常,因此它在我的Web服务器中提高了500。
我花了一段时间才了解到我在守护程序/后台运行的调试代码是造成此问题的原因。我觉得很傻。
除了 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/
无论如何,你的问题缺乏非常需要的背景。请补充您的问题。
一种可能的原因是您正在运行Python script in the background。当某个进程在后台运行时,您将无法通过终端将输入发送到该进程,因此pdb控制台将无法正常工作。最终,它引发了bdbquit。
| 归档时间: |
|
| 查看次数: |
16172 次 |
| 最近记录: |