faulthandler --- Python トレースバックをダンプする¶
Added in version 3.3.
このモジュールには、Python のトレースバックを明示的にダンプしたり、フォールトの発生時、タイムアウト後、ユーザーシグナルの受信時にダンプしたりする関数があります。
SIGSEGV、SIGFPE、SIGABRT、SIGBUS、SIGILL シグナルに対するフォールトハンドラを登録するには、faulthandler.enable() を呼び出してください。
環境変数 PYTHONFAULTHANDLER を設定するか、コマンドラインオプション -X faulthandler を指定すると、起動時に有効にすることもできます。
Pythonのフォールトハンドラは、apportやWindowsのフォールトハンドラのようなシステムフォールトハンドラと互換性があります。このモジュールは sigaltstack() 関数が使用可能であればシグナルハンドラ用に代替スタックを利用します。これによってスタックオーバーフロー時にもトレースバックを出力することができます。
フォールトハンドラは絶望的なケースで呼び出されます。そのためシグナルセーフな関数しか使うことができません (例: ヒープメモリ上にメモリ確保はできません)。この制限により、tracebackのダンプ機能は通常のPythonのtracebackと比べてごく僅かなものです:
ASCIIのみサポートされます。エンコード時には
backslashreplaceエラーハンドラを使用します。すべての文字列は500文字以内に制限されています。
ファイル名、関数名、行番号だけを表示します (ソースコードは表示しません)。
100フレーム、100スレッドに制限されています。
順序は逆で、最も新しい呼び出しから表示します。
デフォルトでは、Pythonのtracebackは sys.stderr に書き出されます。tracebackを見るには、対象アプリケーションはターミナル上で実行しなければなりません。 faulthandler.enable() に渡す引数によってログファイルを指定することができます。
モジュールはC言語で実装されているので、アプリのクラッシュ時でもPythonがデッドロックした場合でもダンプができます。
Python 開発モード は Python の起動時に faulthandler.enable() を呼び出します。
参考
tracebackのダンプ¶
- faulthandler.dump_traceback(file=sys.stderr, all_threads=True)¶
全スレッドのtracebackを file へダンプします。もし all_threads が
Falseであれば、現在のスレッドのみダンプします。参考
トレースバックオブジェクトの表示に使える
traceback.print_tb()。バージョン 3.5 で変更: この関数にファイル記述子を渡せるようになりました。
フォールトハンドラの状態¶
- faulthandler.enable(file=sys.stderr, all_threads=True)¶
フォールトハンドラを有効にします。 Python のトレースバックをダンプするために、
SIGSEGV、SIGFPE、SIGABRT、SIGBUS、SIGILLシグナルのハンドラを登録します。 all_threads がTrueの場合は、実行中のすべてのスレッドのトレースバックを出力します。 それ以外の場合は現在のスレッドだけをダンプします。フォールトハンドラを無効にするまで file を開いたままにしておく必要があります。 ファイル記述子の問題 を参照してください。
バージョン 3.5 で変更: この関数にファイル記述子を渡せるようになりました。
バージョン 3.6 で変更: Windows では、Windows 例外のハンドラも登録するようになりました。
バージョン 3.10 で変更: all_threads が真で、ガベージコレクタが回収処理を実行中の場合、そのこともダンプに表示するようになりました。
- faulthandler.is_enabled()¶
フォールトハンドラが有効かどうかチェックします。
タイムアウト後にtracebackをダンプする¶
- faulthandler.dump_traceback_later(timeout, repeat=False, file=sys.stderr, exit=False)¶
Dump the tracebacks of all threads, after a timeout of timeout seconds, or every timeout seconds if repeat is
True. If exit isTrue, call_exit()with status=1 after dumping the tracebacks. (Note_exit()exits the process immediately, which means it doesn't do any cleanup like flushing file buffers.) If the function is called twice, the new call replaces previous parameters and resets the timeout. The timer has a sub-second resolution.トレースバックがダンプされるか
cancel_dump_traceback_later()が呼び出されるまで、file を開いたままにしておく必要があります。 ファイル記述子の問題 を参照してください。この関数は監視用のスレッドを使って実装されています。
バージョン 3.5 で変更: この関数にファイル記述子を渡せるようになりました。
バージョン 3.7 で変更: この関数は常に利用可能になりました。
- faulthandler.cancel_dump_traceback_later()¶
dump_traceback_later()の最新の呼び出しをキャンセルします。
ユーザシグナルに対してtracebackをダンプする¶
- faulthandler.register(signum, file=sys.stderr, all_threads=True, chain=False)¶
ユーザシグナルを登録します: すべてのスレッドでtracebackをダンプするために signum シグナルをインストールします。ただし all_threads が
Falseであれば現在のスレッドのみ file にダンプします。もし chain がTrueであれば以前のハンドラも呼び出します。unregister()でシグナルの登録を解除するまで、file を開いたままにしておく必要があります。 ファイル記述子の問題 を参照してください。Windowsでは利用不可です。
バージョン 3.5 で変更: この関数にファイル記述子を渡せるようになりました。
- faulthandler.unregister(signum)¶
ユーザシグナルを登録解除します:
register()でインストールした signum シグナルハンドラをアンインストールします。シグナルが登録された場合はTrueを返し、そうでなければFalseを返します。Windowsでは利用不可です。
ファイル記述子の問題¶
enable()、dump_traceback_later() ならびに register() は引数 file に渡されたファイル記述子を保持します。ファイルが閉じられファイル記述子が新しいファイルで再利用された場合や、os.dup2() の使用でファイル記述子が置き換えた場合、 traceback の結果は別のファイルへ書き込まれます。ファイルが置き換えられた場合は、毎回これらの関数を呼び出しなおしてください。
使用例¶
フォールトハンドラを有効化・無効化したときの Linuxでのセグメンテーションフォールトの例:
$ python -c "import ctypes; ctypes.string_at(0)"
Segmentation fault
$ python -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