時々スタックしてしまう Python アプリケーションがありますが、どこでスタックするのかわかりません。
実行中の正確なコードを表示するように Python インタープリターに通知する方法はありますか?
オンザフライのスタックトレースのようなものですか?
関連する質問:
ベストアンサー1
このような状況で使用するモジュールがあります。プロセスは長時間実行されているものの、不明で再現できない理由で時々停止してしまう場合です。これは少しハッキーで、Unix でのみ動作します (シグナルが必要)。
import code, traceback, signal
def debug(sig, frame):
"""Interrupt running process, and provide a python prompt for
interactive debugging."""
d={'_frame':frame} # Allow access to frame object.
d.update(frame.f_globals) # Unless shadowed by global
d.update(frame.f_locals)
i = code.InteractiveConsole(d)
message = "Signal received : entering python shell.\nTraceback:\n"
message += ''.join(traceback.format_stack(frame))
i.interact(message)
def listen():
signal.signal(signal.SIGUSR1, debug) # Register handler
使用するには、プログラムの起動時に listen() 関数を呼び出し (site.py に貼り付けて、すべての Python プログラムで使用できるようにすることもできます)、実行します。任意の時点で、kill を使用して、または Python で次のようにプロセスに SIGUSR1 シグナルを送信します。
os.kill(pid, signal.SIGUSR1)
これにより、プログラムは現在いるポイントで Python コンソールにブレークし、スタック トレースを表示して、変数を操作できるようになります。実行を継続するには、control-d (EOF) を使用します (ただし、シグナルを送ったポイントで I/O などが中断される可能性が高いため、完全に非侵入的ではないことに注意してください)。
同じことを行う別のスクリプトがありますが、パイプを介して実行中のプロセスと通信します(バックグラウンドプロセスなどのデバッグを可能にするため)。ここに投稿するには少し大きいですが、Python クックブック レシピ。