Документация Python неофициальный перевод

faulthandler.md

95 строк · 8.9 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.4/library/faulthandler.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 27.2. [`faulthandler`](https://python-all.ru/3.4/library/faulthandler.html#module-faulthandler) – Дамп трассировки Python89Новое в версии 3.3.1011Этот модуль содержит функции для явного вывода трассировки Python при сбое, по таймауту или по сигналу пользователя. Вызовите [`faulthandler.enable()`](https://python-all.ru/3.4/library/faulthandler.html#faulthandler.enable), чтобы установить обработчики сбоев для сигналов `SIGSEGV`, `SIGFPE`, `SIGABRT`, `SIGBUS`, и `SIGILL`. Вы также можете включить их при запуске, установив переменную окружения [`PYTHONFAULTHANDLER`](https://python-all.ru/3.4/using/cmdline.html#envvar-PYTHONFAULTHANDLER) или используя параметр командной строки [*-X*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-X) `faulthandler`.1213Обработчик сбоев совместим с системными обработчиками сбоев, такими как Apport или обработчик сбоев Windows. Модуль использует альтернативный стек для обработчиков сигналов, если доступна функция `sigaltstack()`. Это позволяет выводить трассировку даже при переполнении стека.1415Обработчик сбоев вызывается в катастрофических ситуациях и поэтому может использовать только сигналобезопасные функции (например, не может выделять память в куче). Из-за этого ограничения дамп трассировки является минимальным по сравнению с обычными трассировками Python:1617- Поддерживается только ASCII. При кодировании используется обработчик ошибок `backslashreplace`.18- Каждая строка ограничена 500 символами.19- Отображаются только имя файла, имя функции и номер строки (исходный код не показывается).20- Ограничение – 100 фреймов и 100 потоков.21- Порядок обратный: сначала показывается самый последний вызов.2223По умолчанию трассировка Python записывается в [`sys.stderr`](https://python-all.ru/3.4/library/sys.html#sys.stderr). Чтобы увидеть трассировки, приложения должны запускаться в терминале. В качестве альтернативы можно передать файл журнала в [`faulthandler.enable()`](https://python-all.ru/3.4/library/faulthandler.html#faulthandler.enable).2425Модуль реализован на C, поэтому трассировки могут быть выгружены при сбое или при взаимоблокировке Python.2627## 27.2.1. Вывод трассировки2829#### `faulthandler.dump_traceback(file=sys.stderr, all_threads=True)`3031Выводит трассировки всех потоков в *file*. Если *all\_threads* равно `False`, выводится только текущий поток.3233## 27.2.2. Состояние обработчика сбоев3435#### `faulthandler.enable(file=sys.stderr, all_threads=True)`3637Включает обработчик сбоев: устанавливает обработчики для сигналов `SIGSEGV`, `SIGFPE`, `SIGABRT`, `SIGBUS` и `SIGILL` для вывода трассировки Python. Если *all\_threads* равно `True`, создаются трассировки для каждого работающего потока. В противном случае выводится только текущий поток.3839#### `faulthandler.disable()`4041Отключает обработчик сбоев: удаляет обработчики сигналов, установленные вызовом [`enable()`](https://python-all.ru/3.4/library/faulthandler.html#faulthandler.enable).4243#### `faulthandler.is_enabled()`4445Проверяет, включён ли обработчик ошибок.4647## 27.2.3. Вывод трассировок после тайм-аута4849#### `faulthandler.dump_traceback_later(timeout, repeat=False, file=sys.stderr, exit=False)`5051Выводит трассировки всех потоков по истечении *timeout* секунд или каждые *timeout* секунд, если *repeat* равно `True`. Если *exit* равно `True`, вызывает `_exit()` с status=1 после вывода трассировок. (Обратите внимание: `_exit()` немедленно завершает процесс, то есть не выполняет никакой очистки, например сброса буферов файлов.) Если функция вызывается дважды, новый вызов заменяет предыдущие параметры и сбрасывает таймер. Таймер имеет субсекундное разрешение.5253Эта функция реализована с использованием потока-сторожа, поэтому она недоступна, если Python скомпилирован с отключёнными потоками.5455#### `faulthandler.cancel_dump_traceback_later()`5657Отменяет последний вызов [`dump_traceback_later()`](https://python-all.ru/3.4/library/faulthandler.html#faulthandler.dump_traceback_later).5859## 27.2.4. Вывод трассировки по сигналу пользователя6061#### `faulthandler.register(signum, file=sys.stderr, all_threads=True, chain=False)`6263Регистрирует пользовательский сигнал: устанавливает обработчик для сигнала *signum*, который выводит трассировку всех потоков (или только текущего, если *all\_threads* равно `False`) в *file*. Вызывает предыдущий обработчик, если chain равно `True`.6465Недоступно в Windows.6667#### `faulthandler.unregister(signum)`6869Отменяет регистрацию пользовательского сигнала: удаляет обработчик сигнала *signum*, установленный вызовом [`register()`](https://python-all.ru/3.4/library/faulthandler.html#faulthandler.register). Возвращает `True`, если сигнал был зарегистрирован, иначе `False`.7071Недоступно в Windows.7273## 27.2.5. Проблема с файловыми дескрипторами7475[`enable()`](https://python-all.ru/3.4/library/faulthandler.html#faulthandler.enable), [`dump_traceback_later()`](https://python-all.ru/3.4/library/faulthandler.html#faulthandler.dump_traceback_later) и [`register()`](https://python-all.ru/3.4/library/faulthandler.html#faulthandler.register) сохраняют файловый дескриптор своего аргумента *file*. Если файл закрыт и его файловый дескриптор переиспользован новым файлом, или если [`os.dup2()`](https://python-all.ru/3.4/library/os.html#os.dup2) используется для замены файлового дескриптора, трассировка будет записана в другой файл. Вызывайте эти функции заново каждый раз, когда файл заменяется.7677## 27.2.6. Пример7879Пример ошибки сегментации в Linux при включённом и выключенном обработчике ошибок:8081```sh82$ python3 -c "import ctypes; ctypes.string_at(0)"83Segmentation fault8485$ python3 -q -X faulthandler86>>> import ctypes87>>> ctypes.string_at(0)88Fatal Python error: Segmentation fault8990Current thread 0x00007fb899f39700 (most recent call first):91  File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at92  File "<stdin>", line 1 in <module>93Segmentation fault94```95