faulthandler — 转储 Python 回溯

3.3 版本新增。


此模块包含在发生故障、超时后或在用户信号上显式转储 Python 回溯的函数。调用 faulthandler.enable() 来为 SIGSEGVSIGFPESIGABRTSIGBUSSIGILL 信号安装故障处理程序。您还可以通过设置 PYTHONFAULTHANDLER 环境变量或使用 -X faulthandler 命令行选项在启动时启用它们。

故障处理程序与系统故障处理程序(如 Apport 或 Windows 故障处理程序)兼容。如果 sigaltstack() 函数可用,则该模块会为信号处理程序使用备用堆栈。这使得它即使在堆栈溢出时也能转储回溯。

故障处理程序在灾难性情况下被调用,因此只能使用信号安全函数(例如,它不能在堆上分配内存)。由于此限制,与普通的 Python 回溯相比,回溯转储是最小的

  • 仅支持 ASCII。在编码时使用 backslashreplace 错误处理程序。

  • 每个字符串的长度限制为 500 个字符。

  • 仅显示文件名、函数名和行号。(没有源代码)

  • 它限制为 100 个帧和 100 个线程。

  • 顺序是相反的:最近的调用首先显示。

默认情况下,Python 回溯写入 sys.stderr。要查看回溯,应用程序必须在终端中运行。或者,可以将日志文件传递给 faulthandler.enable()

该模块是用 C 实现的,因此可以在崩溃或 Python 死锁时转储回溯。

Python 开发模式 在 Python 启动时调用 faulthandler.enable()

另请参阅

模块 pdb

用于 Python 程序的交互式源代码调试器。

模块 traceback

用于提取、格式化和打印 Python 程序堆栈跟踪的标准接口。

转储回溯

faulthandler.dump_traceback(file=sys.stderr, all_threads=True)

将所有线程的回溯转储到 file 中。如果 all_threadsFalse,则仅转储当前线程。

另请参阅

traceback.print_tb(),可用于打印回溯对象。

在 3.5 版本中更改: 添加了对此函数传递文件描述符的支持。

故障处理程序状态

faulthandler.enable(file=sys.stderr, all_threads=True)

启用故障处理程序:为 SIGSEGVSIGFPESIGABRTSIGBUSSIGILL 信号安装处理程序,以转储 Python 回溯。如果 all_threadsTrue,则为每个正在运行的线程生成回溯。否则,仅转储当前线程。

file 必须保持打开状态,直到禁用故障处理程序:请参阅 文件描述符问题

在 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 秒的超时后,或如果 repeatTrue,则每隔 timeout 秒转储所有线程的回溯。如果 exitTrue,则在转储回溯后调用 status=1 的 _exit()。(注意 _exit() 会立即退出进程,这意味着它不会执行任何清理操作,例如刷新文件缓冲区。)如果该函数被调用两次,则新的调用会替换之前的参数并重置超时。计时器具有亚秒级分辨率。

file 必须保持打开状态,直到回溯被转储或调用 cancel_dump_traceback_later():请参阅 文件描述符问题

此函数是使用看门狗线程实现的。

在 3.5 版本中更改: 添加了对此函数传递文件描述符的支持。

在 3.7 版本中更改: 此函数现在始终可用。

faulthandler.cancel_dump_traceback_later()

取消上次对 dump_traceback_later() 的调用。

在用户信号上转储回溯

faulthandler.register(signum, file=sys.stderr, all_threads=True, chain=False)

注册用户信号:为 signum 信号安装一个处理程序,以将所有线程的回溯转储到 file 中,或者如果 all_threadsFalse,则仅转储当前线程的回溯。如果 chain 为 True,则调用之前的处理程序。

文件必须保持打开状态,直到通过 unregister() 取消注册信号:请参阅 文件描述符问题

在 Windows 上不可用。

在 3.5 版本中更改: 添加了对此函数传递文件描述符的支持。

faulthandler.unregister(signum)

取消注册用户信号:卸载由 register() 安装的 signum 信号的处理程序。如果信号已注册,则返回 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