faulthandler
— Выгрузите трассировку Python¶
Added in version 3.3.
Этот модуль содержит функции для сброса трассировки Python в явном виде, по ошибке, после таймаута или по сигналу пользователя. Вызовите faulthandler.enable()
, чтобы установить обработчики ошибок для сигналов SIGSEGV
, SIGFPE
, SIGABRT
, SIGBUS
и SIGILL
. Вы также можете включить их при запуске, установив переменную окружения PYTHONFAULTHANDLER
или используя опцию -X
faulthandler
в командной строке.
Обработчик ошибок совместим с системными обработчиками ошибок, такими как Apport или обработчик ошибок Windows. Модуль использует альтернативный стек для обработчиков сигналов, если доступна функция sigaltstack()
. Это позволяет ему сбрасывать трассировку даже при переполнении стека.
Обработчик ошибок вызывается в катастрофических случаях и поэтому может использовать только сигналобезопасные функции (например, не может выделять память из кучи). Из-за этого ограничения дамп трассировки минимален по сравнению с обычными трассировками Python:
Поддерживается только ASCII. При кодировании используется обработчик ошибок
backslashreplace
.Каждая строка ограничена 500 символами.
Отображаются только имя файла, имя функции и номер строки. (без исходного кода)
Он ограничен 100 кадрами и 100 нитями.
Порядок обратный: самый последний вызов показывается первым.
По умолчанию отслеживание в Python записывается в sys.stderr
. Чтобы увидеть отслеживание, приложения должны быть запущены в терминале. В качестве альтернативы в faulthandler.enable()
может быть передан файл журнала.
Модуль реализован на языке C, поэтому трассировки могут быть сброшены в случае сбоя или когда Python заходит в тупик.
При запуске Python Python Development Mode вызывает faulthandler.enable()
.
См.также
Выгрузка обратной трассировки¶
- faulthandler.dump_traceback(file=sys.stderr, all_threads=True)¶
Сбросьте трассировки всех потоков в файл. Если 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. (Обратите внимание, что_exit()
завершает процесс немедленно, то есть не производит никакой очистки, например, промывки файловых буферов). Если функция вызывается дважды, новый вызов заменяет предыдущие параметры и сбрасывает таймаут. Таймер имеет субсекундное разрешение.Файл file должен оставаться открытым до тех пор, пока трассировка не будет сброшена или не будет вызван
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
, в file. Вызовите предыдущий обработчик, если chain имеет значение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 с включением и без включения обработчика ошибок:
$ 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