Skip to main content

27.2. faulthandler —转储Python回溯

3.3 新版功能.


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

故障处理程序与系统故障处理程序(如Apport或Windows故障处理程序)兼容。如果 sigaltstack() 功能可用,模块使用替代堆栈用于信号处理程序。这允许它转储traceback甚至在堆栈溢出。

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

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

  • 每个字符串限制为500个字符。

  • 仅显示文件名,功能名称和行号。 (无源代码)

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

  • 顺序相反:最近的呼叫首先显示。

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

该模块在C中实现,因此traceback可以转储崩溃或当Python死锁。

27.2.1. 倾销追溯

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

将所有线程的跟踪转储到 file 中。如果 all_threadsFalse,只转储当前线程。

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

27.2.2. 故障处理程序状态

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

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

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

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

在 3.6 版更改: 在Windows上,还安装了Windows异常的处理程序。

faulthandler.disable()

禁用故障处理程序:卸载由 enable() 安装的信号处理程序。

faulthandler.is_enabled()

检查故障处理程序是否已启用。

27.2.3. 超时后转储跟踪

faulthandler.dump_traceback_later(timeout, repeat=False, file=sys.stderr, exit=False)

如果 repeatTrue,则在超时 timeout 秒或每个 timeout 秒后转储所有线程的跟踪。如果 exitTrue,则在转储追踪后调用状态为1的 _exit()。 (注意,_exit() 立即退出该过程,这意味着它不会执行任何清理,如刷新文件缓冲区。)如果该函数被调用两次,则新调用将替换以前的参数并重置超时。定时器具有亚秒分辨率。

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

此函数使用看门狗线程实现,因此如果Python编译时禁用线程,则不可用。

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

faulthandler.cancel_dump_traceback_later()

取消最后一次呼叫 dump_traceback_later()

27.2.4. 丢弃用户信号上的追溯

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

注册用户信号:安装 signum 信号的处理程序,将所有线程的跟踪或当前线程(如果 all_threadsFalse)转储到 file 中。如果链是 True,调用上一个处理程序。

file 必须保持打开,直到信号未被 unregister() 注册:参见 文件描述符的问题

在Windows上不可用。

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

faulthandler.unregister(signum)

注销用户信号:卸载由 register() 安装的 signum 信号的处理程序。如果信号已注册,返回 True,否则返回 False

在Windows上不可用。

27.2.5. 文件描述符的问题

enable()dump_traceback_later()register() 保留其 file 参数的文件描述符。如果文件被关闭并且其文件描述符被一个新文件重用,或者如果使用 os.dup2() 来替换文件描述符,则追溯将被写入不同的文件。每次更换文件时都调用这些函数。

27.2.6. 例

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