faulthandler — Python-Traceback ausgeben¶
Hinzugefügt in Version 3.3.
Dieses Modul enthält Funktionen, um Python-Tracebacks explizit auszugeben, bei einem Fehler, nach einem Timeout oder bei einem Benutzersignal. Rufen Sie faulthandler.enable() auf, um Fehlerbehandler für die Signale SIGSEGV, SIGFPE, SIGABRT, SIGBUS und SIGILL zu installieren. Sie können sie auch beim Start aktivieren, indem Sie die Umgebungsvariable PYTHONFAULTHANDLER setzen oder die Kommandozeilenoption -X faulthandler verwenden.
Der Fehlerbehandler ist kompatibel mit systemweiten Fehlerbehandlern wie Apport oder dem Windows-Fehlerbehandler. Das Modul verwendet einen alternativen Stack für Signalbehandler, wenn die Funktion sigaltstack() verfügbar ist. Dies ermöglicht die Ausgabe des Tracebacks auch bei einem Stack-Überlauf.
Der Fehlerbehandler wird in katastrophalen Fällen aufgerufen und kann daher nur signal-sichere Funktionen verwenden (z. B. kann er keinen Speicher auf dem Heap allozieren). Aufgrund dieser Einschränkung ist die Traceback-Ausgabe im Vergleich zu normalen Python-Tracebacks minimal.
Nur ASCII wird unterstützt. Der Fehlerbehandler
backslashreplacewird bei der Kodierung verwendet.Jede Zeichenkette ist auf 500 Zeichen begrenzt.
Nur der Dateiname, der Funktionsname und die Zeilennummer werden angezeigt. (kein Quellcode)
Es ist auf 100 Frames und 100 Threads beschränkt.
Die Reihenfolge ist umgekehrt: Der zuletzt aufgerufene Aufruf wird zuerst angezeigt.
Standardmäßig wird der Python-Traceback nach sys.stderr geschrieben. Um Tracebacks zu sehen, müssen Anwendungen im Terminal ausgeführt werden. Alternativ kann eine Logdatei an faulthandler.enable() übergeben werden.
Das Modul ist in C implementiert, sodass Tracebacks bei einem Absturz oder wenn Python blockiert ist, ausgegeben werden können.
Der Python Development Mode ruft faulthandler.enable() beim Start von Python auf.
Siehe auch
Traceback ausgeben¶
- faulthandler.dump_traceback(file=sys.stderr, all_threads=True)¶
Gibt die Tracebacks aller Threads in file aus. Wenn all_threads
Falseist, wird nur der aktuelle Thread ausgegeben.Siehe auch
traceback.print_tb(), die zum Ausgeben eines Traceback-Objekts verwendet werden kann.Geändert in Version 3.5: Unterstützung für die Übergabe eines Dateideskriptors an diese Funktion hinzugefügt.
C-Stack ausgeben¶
Hinzugefügt in Version 3.14.
- faulthandler.dump_c_stack(file=sys.stderr)¶
Gibt den C-Stack-Trace des aktuellen Threads in file aus.
Wenn die Python-Build-Unterstützung dafür fehlt oder das Betriebssystem keinen Stack-Trace bereitstellt, wird anstelle eines ausgegebenen C-Stacks eine Fehlermeldung ausgegeben.
C-Stack-Kompatibilität¶
Wenn das System das C-Level-backtrace(3) oder dladdr1(3) nicht unterstützt, funktionieren C-Stack-Dumps nicht. Stattdessen wird eine Fehlermeldung ausgegeben.
Zusätzlich unterstützen einige Compiler die CPython-Implementierung von C-Stack-Dumps nicht. Infolgedessen kann eine andere Fehlermeldung anstelle des Stacks ausgegeben werden, selbst wenn das Betriebssystem das Ausgeben von Stacks unterstützt.
Hinweis
Das Ausgeben von C-Stacks kann beliebig langsam sein, abhängig vom DWARF-Level der Binaries im Aufrufstapel.
Zustand des Fehlerbehandlers¶
- faulthandler.enable(file=sys.stderr, all_threads=True, c_stack=True)¶
Aktiviert den Fehlerbehandler: Installiert Behandler für die Signale
SIGSEGV,SIGFPE,SIGABRT,SIGBUSundSIGILL, um den Python-Traceback auszugeben. Wenn all_threadsTrueist, werden für jeden laufenden Thread Tracebacks erzeugt. Andernfalls wird nur der aktuelle Thread ausgegeben.Das file muss geöffnet bleiben, bis der Fehlerbehandler deaktiviert wird: siehe Problem mit Dateideskriptoren.
Wenn c_stack
Trueist, wird der C-Stack-Trace nach dem Python-Traceback ausgegeben, es sei denn, das System unterstützt dies nicht. Siehedump_c_stack()für weitere Informationen zur Kompatibilität.Geändert in Version 3.5: Unterstützung für die Übergabe eines Dateideskriptors an diese Funktion hinzugefügt.
Geändert in Version 3.6: Unter Windows wird auch ein Behandler für Windows-Ausnahmen installiert.
Geändert in Version 3.10: Der Dump erwähnt nun, ob eine Garbage-Collector-Sammlung läuft, wenn all_threads wahr ist.
Geändert in Version 3.14: Nur der aktuelle Thread wird ausgegeben, wenn die GIL deaktiviert ist, um das Risiko von Datenrennen zu vermeiden.
Geändert in Version 3.14: Der Dump zeigt nun den C-Stack-Trace an, wenn c_stack wahr ist.
- faulthandler.disable()¶
Deaktiviert den Fehlerbehandler: Deinstalliert die von
enable()installierten Signalbehandler.
- faulthandler.is_enabled()¶
Überprüft, ob der Fehlerbehandler aktiviert ist.
Tracebacks nach einem Timeout ausgeben¶
- faulthandler.dump_traceback_later(timeout, repeat=False, file=sys.stderr, exit=False)¶
Gibt die Tracebacks aller Threads nach einem Timeout von timeout Sekunden aus, oder alle timeout Sekunden, wenn repeat
Trueist. Wenn exitTrueist, wird nach der Ausgabe der Tracebacks_exit()mit Status=1 aufgerufen. (Hinweis:_exit()beendet den Prozess sofort, was bedeutet, dass keine Bereinigungsarbeiten wie das Leeren von Dateipuffern durchgeführt werden.) Wenn die Funktion zweimal aufgerufen wird, ersetzt der neue Aufruf die vorherigen Parameter und setzt den Timeout zurück. Der Timer hat eine Untersekunden-Auflösung.Das file muss geöffnet bleiben, bis der Traceback ausgegeben wird oder
cancel_dump_traceback_later()aufgerufen wird: siehe Problem mit Dateideskriptoren.Diese Funktion wird mithilfe eines Watchdog-Threads implementiert.
Geändert in Version 3.5: Unterstützung für die Übergabe eines Dateideskriptors an diese Funktion hinzugefügt.
Geändert in Version 3.7: Diese Funktion ist jetzt immer verfügbar.
- faulthandler.cancel_dump_traceback_later()¶
Bricht den letzten Aufruf von
dump_traceback_later()ab.
Traceback bei Benutzersignal ausgeben¶
- faulthandler.register(signum, file=sys.stderr, all_threads=True, chain=False)¶
Registriert ein Benutzersignal: Installiert einen Behandler für das signum-Signal, um den Traceback aller Threads, oder nur des aktuellen Threads (wenn all_threads
Falseist), in file auszugeben. Ruft den vorherigen Behandler auf, wenn chainTrueist.Das file muss geöffnet bleiben, bis das Signal durch
unregister()deregistriert wird: siehe Problem mit Dateideskriptoren.Nicht auf Windows verfügbar.
Geändert in Version 3.5: Unterstützung für die Übergabe eines Dateideskriptors an diese Funktion hinzugefügt.
- faulthandler.unregister(signum)¶
Deregistriert ein Benutzersignal: Deinstalliert den Behandler für das signum-Signal, der von
register()installiert wurde. GibtTruezurück, wenn das Signal registriert war, andernfallsFalse.Nicht auf Windows verfügbar.
Problem mit Dateideskriptoren¶
enable(), dump_traceback_later() und register() behalten den Dateideskriptor ihres file-Arguments bei. Wenn die Datei geschlossen und ihr Dateideskriptor von einer neuen Datei wiederverwendet wird, oder wenn os.dup2() verwendet wird, um den Dateideskriptor zu ersetzen, wird der Traceback in eine andere Datei geschrieben. Rufen Sie diese Funktionen jedes Mal erneut auf, wenn die Datei ersetzt wird.
Beispiel¶
Beispiel für einen Segmentierungsfehler unter Linux mit und ohne Aktivierung des Fehlerbehandlers
$ 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 "/opt/python/Lib/ctypes/__init__.py", line 486 in string_at
File "<stdin>", line 1 in <module>
Current thread's C stack trace (most recent call first):
Binary file "/opt/python/python", at _Py_DumpStack+0x42 [0x5b27f7d7147e]
Binary file "/opt/python/python", at +0x32dcbd [0x5b27f7d85cbd]
Binary file "/opt/python/python", at +0x32df8a [0x5b27f7d85f8a]
Binary file "/usr/lib/libc.so.6", at +0x3def0 [0x77b73226bef0]
Binary file "/usr/lib/libc.so.6", at +0x17ef9c [0x77b7323acf9c]
Binary file "/opt/python/build/lib.linux-x86_64-3.14/_ctypes.cpython-314d-x86_64-linux-gnu.so", at +0xcdf6 [0x77b7315dddf6]
Binary file "/usr/lib/libffi.so.8", at +0x7976 [0x77b73158f976]
Binary file "/usr/lib/libffi.so.8", at +0x413c [0x77b73158c13c]
Binary file "/usr/lib/libffi.so.8", at ffi_call+0x12e [0x77b73158ef0e]
Binary file "/opt/python/build/lib.linux-x86_64-3.14/_ctypes.cpython-314d-x86_64-linux-gnu.so", at +0x15a33 [0x77b7315e6a33]
Binary file "/opt/python/build/lib.linux-x86_64-3.14/_ctypes.cpython-314d-x86_64-linux-gnu.so", at +0x164fa [0x77b7315e74fa]
Binary file "/opt/python/build/lib.linux-x86_64-3.14/_ctypes.cpython-314d-x86_64-linux-gnu.so", at +0xc624 [0x77b7315dd624]
Binary file "/opt/python/python", at _PyObject_MakeTpCall+0xce [0x5b27f7b73883]
Binary file "/opt/python/python", at +0x11bab6 [0x5b27f7b73ab6]
Binary file "/opt/python/python", at PyObject_Vectorcall+0x23 [0x5b27f7b73b04]
Binary file "/opt/python/python", at _PyEval_EvalFrameDefault+0x490c [0x5b27f7cbb302]
Binary file "/opt/python/python", at +0x2818e6 [0x5b27f7cd98e6]
Binary file "/opt/python/python", at +0x281aab [0x5b27f7cd9aab]
Binary file "/opt/python/python", at PyEval_EvalCode+0xc5 [0x5b27f7cd9ba3]
Binary file "/opt/python/python", at +0x255957 [0x5b27f7cad957]
Binary file "/opt/python/python", at +0x255ab4 [0x5b27f7cadab4]
Binary file "/opt/python/python", at _PyEval_EvalFrameDefault+0x6c3e [0x5b27f7cbd634]
Binary file "/opt/python/python", at +0x2818e6 [0x5b27f7cd98e6]
Binary file "/opt/python/python", at +0x281aab [0x5b27f7cd9aab]
Binary file "/opt/python/python", at +0x11b6e1 [0x5b27f7b736e1]
Binary file "/opt/python/python", at +0x11d348 [0x5b27f7b75348]
Binary file "/opt/python/python", at +0x11d626 [0x5b27f7b75626]
Binary file "/opt/python/python", at PyObject_Call+0x20 [0x5b27f7b7565e]
Binary file "/opt/python/python", at +0x32a67a [0x5b27f7d8267a]
Binary file "/opt/python/python", at +0x32a7f8 [0x5b27f7d827f8]
Binary file "/opt/python/python", at +0x32ac1b [0x5b27f7d82c1b]
Binary file "/opt/python/python", at Py_RunMain+0x31 [0x5b27f7d82ebe]
<truncated rest of calls>
Segmentation fault