faulthandler — Pythonトレースバックをダンプします—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/library/faulthandler
移動先:案内検索

faulthandler —Pythonトレースバックをダンプします

バージョン3.3の新機能。



このモジュールには、Pythonトレースバックを明示的に、障害時に、タイムアウト後に、またはユーザーシグナルでダンプする関数が含まれています。 faulthandler.enable()を呼び出して、SIGSEGVSIGFPESIGABRTSIGBUS、およびSIGILL信号。 PYTHONFAULTHANDLER 環境変数を設定するか、 -X faulthandlerコマンドラインオプションを使用して、起動時にこれらを有効にすることもできます。

フォールトハンドラーは、ApportやWindowsフォールトハンドラーなどのシステムフォールトハンドラーと互換性があります。 sigaltstack()関数が使用可能な場合、モジュールはシグナルハンドラーに代替スタックを使用します。 これにより、スタックオーバーフローでもトレースバックをダンプできます。

フォールトハンドラーは壊滅的なケースで呼び出されるため、シグナルセーフ機能のみを使用できます(例: ヒープにメモリを割り当てることはできません)。 この制限のため、通常のPythonトレースバックと比較して、トレースバックのダンプは最小限に抑えられます。

  • ASCIIのみがサポートされています。 backslashreplaceエラーハンドラーはエンコードに使用されます。
  • 各文字列は500文字に制限されています。
  • ファイル名、関数名、行番号のみが表示されます。 (ソースコードなし)
  • 100フレームと100スレッドに制限されています。
  • 順序が逆になります。最新の呼び出しが最初に表示されます。

デフォルトでは、Pythonトレースバックは sys.stderr に書き込まれます。 トレースバックを表示するには、アプリケーションをターミナルで実行する必要があります。 または、ログファイルを faulthandler.enable()に渡すこともできます。

モジュールはCで実装されているため、クラッシュ時またはPythonがデッドロックされたときにトレースバックをダンプできます。

トレースバックのダンプ

faulthandler.dump_traceback(file=sys.stderr, all_threads=True)

すべてのスレッドのトレースバックをファイルにダンプします。 all_threadsFalseの場合、現在のスレッドのみをダンプします。

バージョン3.5で変更:この関数にファイル記述子を渡すためのサポートが追加されました。


障害ハンドラーの状態

faulthandler.enable(file=sys.stderr, all_threads=True)

フォールトハンドラーを有効にします。SIGSEGVSIGFPESIGABRTSIGBUSSIGILLシグナルのハンドラーをインストールして、Pythonトレースバックをダンプします。 all_threadsTrueの場合、実行中のすべてのスレッドのトレースバックを生成します。 それ以外の場合は、現在のスレッドのみをダンプします。

ファイルは、障害ハンドラーが無効になるまで開いたままにしておく必要があります。ファイル記述子の問題を参照してください。

バージョン3.5で変更:この関数にファイル記述子を渡すためのサポートが追加されました。

バージョン3.6で変更: Windowsでは、Windows例外のハンドラーもインストールされます。

faulthandler.disable()
フォールトハンドラーを無効にします。 enable()によってインストールされたシグナルハンドラーをアンインストールします。
faulthandler.is_enabled()
フォールトハンドラーが有効になっているかどうかを確認します。


タイムアウト後にトレースバックをダンプする

faulthandler.dump_traceback_later(timeout, repeat=False, file=sys.stderr, exit=False)

timeout 秒のタイムアウト後、または repeatTrueの場合は timeout 秒ごとに、すべてのスレッドのトレースバックをダンプします。 exitTrueの場合、トレースバックをダンプした後、status = 1で_exit()を呼び出します。 (_exit()はすぐにプロセスを終了します。つまり、ファイルバッファーのフラッシュなどのクリーンアップは行われません。)関数が2回呼び出されると、新しい呼び出しによって以前のパラメーターが置き換えられ、タイムアウトがリセットされます。 タイマーの分解能は1秒未満です。

ファイルは、トレースバックがダンプされるか、 cancel_dump_traceback_later()が呼び出されるまで開いたままにする必要があります。ファイル記述子の問題を参照してください。

この関数は、ウォッチドッグスレッドを使用して実装されます。

バージョン3.7で変更:この機能は常に利用可能になりました。

バージョン3.5で変更:この関数にファイル記述子を渡すためのサポートが追加されました。

faulthandler.cancel_dump_traceback_later()
dump_traceback_later()への最後の呼び出しをキャンセルします。


ユーザー信号にトレースバックをダンプする

faulthandler.register(signum, file=sys.stderr, all_threads=True, chain=False)

ユーザーシグナルを登録します。 signum シグナルのハンドラーをインストールして、すべてのスレッド、または all_threadsFalseの場合は現在のスレッドのトレースバックをにダンプします。 ]ファイル。 チェーンがTrueの場合は、前のハンドラーを呼び出します。

ファイルは、信号が unregister()によって登録解除されるまで開いたままにしておく必要があります。ファイル記述子の問題を参照してください。

Windowsでは使用できません。

バージョン3.5で変更:この関数にファイル記述子を渡すためのサポートが追加されました。

faulthandler.unregister(signum)

ユーザーシグナルの登録を解除する: register()によってインストールされた signum シグナルのハンドラーをアンインストールします。 信号が登録されている場合はTrueを返し、そうでない場合はFalseを返します。

Windowsでは使用できません。


ファイル記述子の問題

enable()dump_traceback_later()、および register()は、 file 引数のファイル記述子を保持します。 ファイルが閉じられ、そのファイル記述子が新しいファイルによって再利用される場合、または os.dup2()がファイル記述子を置き換えるために使用される場合、トレースバックは別のファイルに書き込まれます。 ファイルが置き換えられるたびに、これらの関数を再度呼び出します。


フォールトハンドラーを有効にした場合と有効にしない場合のLinuxでのセグメンテーションフォールトの例:

$ python3 -c "import ctypes; ctypes.string_at(0)"
Segmentation fault

$ python3 -q -X faulthandler
>>> import ctypes
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault

Current thread 0x00007fb899f39700 (most recent call first):
  File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
  File "<stdin>", line 1 in <module>
Segmentation fault