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–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/faulthandler.html