最近、デバッガを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を読みましたが、なぜこれが私のコードで起こっているのかわかりません。誰もがこれが一般的に起こる理由のいくつかのヒントを提供できますか? I 本当にデバッガーを再び動作させたい。
(pdb)
プロンプトから続行してコードが正常に終了できるようにすると、指定したトレースバックのような出力は期待できませんが、pdb
をquit
コマンドまたは^ D(EOF)で終了すると、そのようなトレースバックが発生しますデバッガーの終了時に発生するBdbQuit
例外をキャッチするものはありません。 bdb.py
では、self.quitting
メソッドによって(およびさまざまなrunメソッドのTrue
句によって)set_quit
がfinally
に設定されます。 trace_dispatch
がTrue
であるときにraise BdbQuit
self.quitting
によって呼び出されるメソッドをディスパッチし、BdbQuit
の典型的なexcept:
句は単純なpass
ステートメントです。 pdb
は、gdb
からすべてを継承します。
つまり、デバッガーの対話が早期に終了した場合、デバッガーが使用するシステムトレース機能を無効にするために例外処理が使用されます。
このトレースバックを完全に回避する1つの方法は、pdb
を異なる方法で使用することです。コードからpdb.set_trace()
を呼び出す(BdbQuit
をまったく処理しない)のではなく、pdb
内で(その逆ではなく)コードを呼び出すことができます。また、コードを変更せずにブレークポイントの場所を選択できます(BdbQuit
のpdb
コマンドを使用)。または、2つのアプローチを組み合わせることができます。 break
、pdb.set_trace()
呼び出しおよびすべての下でコードを実行します。これらの呼び出しは、コードを変更することによってのみ削除できるブレークポイントになります。
pdb
コマンドをコマンドライン引数として使用するか、python -m pdb
を使用してpdb
コマンドを使用すると、pdb
内でコードを呼び出すことができます。
実動コードに_import pdb
_とpdb.set_trace()
を残したときにこれに遭遇しました。 pdb.set_trace()
行が実行されたとき、pythonは、入力がc
ontinueまたはステップインなどに指示するのを待っていました。pythonコードがWebによって呼び出されたためサーバーc
を押して続行しませんでした。しばらくして(どれくらいの長さかわからない)最終的にBdbQuit
例外を発生させました。
その例外をキャッチするためのセットアップがなかったため、Webサーバーで500が発生しました。
デーモン/バックグラウンドで実行されているデバッグコードが問題の原因であることを理解するには、しばらく時間がかかりました。馬鹿げた。
考えられる理由の1つは、Python script in the background
。プロセスがバックグラウンドで実行されている場合、ターミナルを介してプロセスに入力を送信できないため、pdbコンソールは機能しません。最終的に、bdbquitを発生させます。
Eirik Fullerの回答とは別に、別のプロセスで実行されているものでpdb
を使用することはできません。デバッグについては、この答えを確認できます: https://stackoverflow.com/a/23654936/7806805 しかし、非常にハッキングされているように見えるか、プログラムを作成できますシングルスレッドで実行します。ドキュメントを参照してください: 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/ を通過することもできます。
とにかく、あなたの質問には必要なコンテキストが不足しています。質問に追加してください。