3

ソケットを処理するループがあり、pdb.set_trace() ブレークポイントを設定して、ループを通過するたびに select.select() への呼び出しの結果を停止して検査しました。ただし、私のコードには別の場所にもバグがあり、標準のトレースバックが pdb.set_trace によって上書きされているようです。その結果、プログラムが終了すると、トレースバックは、エラーを含む行ではなく、set_trace() の直後の行を指します。

実際のトレースバックにアクセスする方法はありますか、または pdb.set_trace() はそれを上書きしますか?

関連するコード スニペットは次のとおりです。

while True:
    read_socks, write_socks, _ = select.select(all_sockets, all_sockets, '')
    pdb.set_trace()

    if listen_socket.fileno() in read_socks:
        new_socket, address = listen_socket.accept()
        id_num = new_socket.fileno()
        all_sockets[id_num] = new_socket

    for id_num in write_socks:
        # do something that triggers an Assertion error

そして、次のようにトレースバックを取得します。

Traceback (most recent call last):
  File "socktactoe_server.py", line 62, in <module>
    if listen_sock.fileno() in read_socks:
AssertionError

以下は、再現可能な短いテスト ケースです。cそれを実行し、ブレークポイントがあるたびにヒットし、2 回目の続行後にassert例外が発生し、間違った行について報告されます。

import pdb
x = 0
while True:
    pdb.set_trace()
    y = "line of code not triggering an error"
    x += 1
    assert x != 3

出力:

Traceback (most recent call last):
  File "minimal_pdb_traceback.py", line 7, in <module>
    y = "line of code not triggering an error"
AssertionError
4

1 に答える 1

0

Pythonpdbモジュールにバグが見つかったようです。Python バージョン 2.7、3.2、および 3.3 で単純なケースを再現できますが、Python 2.4、2.5、2.6、または 3.1 には問題はありません。

一見すると、Python バグ トラッカーに既存のバグは見当たりません。最小限のテスト ケースと、それを再現できる Python のバージョンを添えて、そこに問題を報告してください。

于 2012-11-15T17:49:26.117 に答える