ソケットを処理するループがあり、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