web-dev-qa-db-ja.com

デバッグ時にBdbquitが発生python

最近、デバッガを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 本当にデバッガーを再び動作させたい。

21
isaachess

(pdb)プロンプトから続行してコードが正常に終了できるようにすると、指定したトレースバックのような出力は期待できませんが、pdbquitコマンドまたは^ D(EOF)で終了すると、そのようなトレースバックが発生しますデバッガーの終了時に発生するBdbQuit例外をキャッチするものはありません。 bdb.pyでは、self.quittingメソッドによって(およびさまざまなrunメソッドのTrue句によって)set_quitfinallyに設定されます。 trace_dispatchTrueであるときにraise BdbQuitself.quittingによって呼び出されるメソッドをディスパッチし、BdbQuitの典型的なexcept:句は単純なpassステートメントです。 pdbは、gdbからすべてを継承します。

つまり、デバッガーの対話が早期に終了した場合、デバッガーが使用するシステムトレース機能を無効にするために例外処理が使用されます。

このトレースバックを完全に回避する1つの方法は、pdbを異なる方法で使用することです。コードからpdb.set_trace()を呼び出す(BdbQuitをまったく処理しない)のではなく、pdb内で(その逆ではなく)コードを呼び出すことができます。また、コードを変更せずにブレークポイントの場所を選択できます(BdbQuitpdbコマンドを使用)。または、2つのアプローチを組み合わせることができます。 breakpdb.set_trace()呼び出しおよびすべての下でコードを実行します。これらの呼び出しは、コードを変更することによってのみ削除できるブレークポイントになります。

pdbコマンドをコマンドライン引数として使用するか、python -m pdbを使用してpdbコマンドを使用すると、pdb内でコードを呼び出すことができます。

11
Eirik Fuller

実動コードに_import pdb_とpdb.set_trace()を残したときにこれに遭遇しました。 pdb.set_trace()行が実行されたとき、pythonは、入力がcontinueまたはステップインなどに指示するのを待っていました。pythonコードがWebによって呼び出されたためサーバーcを押して続行しませんでした。しばらくして(どれくらいの長さかわからない)最終的にBdbQuit例外を発生させました。

その例外をキャッチするためのセットアップがなかったため、Webサーバーで500が発生しました。

デーモン/バックグラウンドで実行されているデバッグコードが問題の原因であることを理解するには、しばらく時間がかかりました。馬鹿げた。

4
teewuane

考えられる理由の1つは、Python script in the background。プロセスがバックグラウンドで実行されている場合、ターミナルを介してプロセスに入力を送信できないため、pdbコンソールは機能しません。最終的に、bdbquitを発生させます。

3
Siva Prakash

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/ を通過することもできます。

とにかく、あなたの質問には必要なコンテキストが不足しています。質問に追加してください。

3