faulthandler — Вывод отладочной информации о Python-трейсе
Новая в версии 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.
Вывод отладочной информации о трейсе
-
faulthandler.dump_traceback(file=sys.stderr, all_threads=True) -
Вывести отладочную информацию о трейсах всех потоков в file. Если all_threads равно
False, вывести только текущий поток.Изменено в версии 3.5: Добавлена поддержка передачи дескриптора файла в эту функцию.
Состояние обработчика ошибок
-
faulthandler.enable(file=sys.stderr, all_threads=True) -
Включить обработчик ошибок: установить обработчики для сигналов
SIGSEGV,SIGFPE,SIGABRT,SIGBUSиSIGILLдля вывода отладочной информации о Python-трейсе. Если all_threads равноTrue, выводить трейсы для каждого работающего потока. В противном случае, выводить только текущий поток.file должен оставаться открытым до тех пор, пока обработчик ошибок не будет отключен: см. проблема с дескрипторами файлов.
Изменено в версии 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 секунд или каждые timeout секунд, если repeat равно
True. Если exit равноTrue, вызвать_exit()со значением status=1 после вывода отладочной информации о трейсах. (Обратите внимание, что_exit()завершает процесс немедленно, что означает, что он не выполняет очистку, такую как сброс буферов файлов.) Если функция вызывается дважды, новый вызов заменяет предыдущие параметры и сбрасывает таймаут. Таймер имеет разрешение ниже секунды.file должен оставаться открытым до тех пор, пока трейс не будет выведен или не будет вызван
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_threads равно
False, в file. Вызов предыдущего обработчика, если chain равноTrue.file должен оставаться открытым до тех пор, пока сигнал не будет дезактивирован с помощью
unregister(): см. проблема с дескрипторами файлов.Недоступно в 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
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/faulthandler.html