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.

См.также

Модуль pdb

Интерактивный отладчик исходного кода для программ на Python.

Модуль traceback

Стандартный интерфейс для извлечения, форматирования и печати трассировок стека программ на 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
Вернуться на верх