faulthandler
— Сбросьте обратную трассировку Python¶
Добавлено в версии 3.3.
Этот модуль содержит функции для явного сброса результатов трассировки Python при сбое, по истечении времени ожидания или по сигналу пользователя. Вызовите faulthandler.enable()
, чтобы установить обработчики неисправностей для сигналов SIGSEGV
, SIGFPE
, SIGABRT
, SIGBUS
, и SIGILL
. Вы также можете включить их при запуске, установив переменную окружения PYTHONFAULTHANDLER
или используя параметр командной строки -X
faulthandler
.
Обработчик ошибок совместим с системными обработчиками ошибок, такими как Apport или Windows fault handler. Модуль использует альтернативный стек для обработки сигналов, если доступна функция sigaltstack()
. Это позволяет выполнять сброс обратной трассировки даже при переполнении стека.
Обработчик ошибок вызывается в катастрофических случаях и, следовательно, может использовать только функции, защищенные от сигналов (например, он не может выделить память в куче). Из-за этого ограничения сброс данных обратной трассировки минимален по сравнению с обычными обратными трассировками Python:
Поддерживается только ASCII. При кодировании используется обработчик ошибок
backslashreplace
.Каждая строка содержит не более 500 символов.
Отображаются только имя файла, название функции и номер строки. (без исходного кода)
Он ограничен 100 кадрами и 100 потоками.
Порядок меняется на противоположный: сначала отображается самый последний звонок.
По умолчанию обратная трассировка Python записывается в sys.stderr
. Чтобы увидеть результаты обратной трассировки, приложения должны запускаться в терминале. В качестве альтернативы можно передать файл журнала в faulthandler.enable()
.
Модуль реализован на C, поэтому обратные трассировки могут быть сброшены при сбое или когда Python находится в тупике.
Python Development Mode вызывает faulthandler.enable()
при запуске Python.
См.также
Сброс обратной связи¶
- faulthandler.dump_traceback(file=sys.stderr, all_threads=True)¶
Сохраните трассировку всех потоков в file. Если значение all_threads равно
False
, сохраните только текущий поток.См.также
traceback.print_tb()
, который можно использовать для печати объекта обратной трассировки.Изменено в версии 3.5: Добавлена поддержка передачи файлового дескриптора в эту функцию.
Состояние обработчика неисправностей¶
- faulthandler.enable(file=sys.stderr, all_threads=True)¶
Включите обработчик ошибок: установите обработчики для сигналов
SIGSEGV
,SIGFPE
,SIGABRT
,SIGBUS
иSIGILL
, чтобы завершить обратную трассировку Python. Если значение all_threads равноTrue
, выполните обратную трассировку для каждого запущенного потока. В противном случае выполните сброс только текущего потока.Файл * должен оставаться открытым до тех пор, пока обработчик ошибок не будет отключен: смотрите issue with file descriptors.
Изменено в версии 3.5: Добавлена поддержка передачи файлового дескриптора в эту функцию.
Изменено в версии 3.6: В Windows также установлен обработчик исключений Windows.
Изменено в версии 3.10: В дампе теперь указывается, запущен ли сборщик мусора, если значение all_threads равно true.
- faulthandler.disable()¶
Отключите обработчик ошибок: удалите обработчики сигналов, установленные с помощью
enable()
.
- faulthandler.is_enabled()¶
Проверьте, включен ли обработчик неисправностей.
Сброс данных обратной трассировки по истечении времени ожидания¶
- faulthandler.dump_traceback_later(timeout, repeat=False, file=sys.stderr, exit=False)¶
Сбрасывайте данные обратной трассировки всех потоков по истечении времени ожидания в timeout секунд или каждые timeout секунды, если repeat равен
True
. Если значение exit равноTrue
, вызовите_exit()
со статусом=1 после завершения трассировки. (Примечание: c:func:_exit немедленно завершает процесс, что означает, что он не выполняет никакой очистки, например, не очищает файловые буферы.) Если функция вызывается дважды, новый вызов заменяет предыдущие параметры и сбрасывает время ожидания. Таймер имеет время ожидания менее секунды.Файл * должен оставаться открытым до тех пор, пока не будет запущена обратная трассировка или не будет вызван
cancel_dump_traceback_later()
: смотрите issue with file descriptors.Эта функция реализована с помощью сторожевого потока.
Изменено в версии 3.5: Добавлена поддержка передачи файлового дескриптора в эту функцию.
Изменено в версии 3.7: Теперь эта функция доступна всегда.
- faulthandler.cancel_dump_traceback_later()¶
Отмените последний вызов на
dump_traceback_later()
.
Вывод обратной трассировки по сигналу пользователя¶
- faulthandler.register(signum, file=sys.stderr, all_threads=True, chain=False)¶
Зарегистрируйте пользовательский сигнал: установите обработчик для сигнала signum, который будет выводить данные обратной трассировки всех потоков или текущего потока, если значение all_threads равно
False
, в файл. Вызовите предыдущий обработчик, если цепочка равнаTrue
.Файл * должен оставаться открытым до тех пор, пока сигнал не будет отменен с помощью
unregister()
: смотрите issue with file descriptors.Недоступно в Windows.
Изменено в версии 3.5: Добавлена поддержка передачи файлового дескриптора в эту функцию.
- faulthandler.unregister(signum)¶
Отмените регистрацию пользовательского сигнала: удалите обработчик сигнала signum, установленный с помощью
register()
. Верните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