実行中のPythonアプリケーションのスタックトレースを表示する 質問する

実行中のPythonアプリケーションのスタックトレースを表示する 質問する

時々スタックしてしまう 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 クックブック レシピ

おすすめ記事