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 Development Mode 电话 faulthandler.enable() 在Python启动时。

丢弃回溯

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

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

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

故障处理程序状态

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

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

这个 file 必须保持打开状态,直到禁用故障处理程序:请参见 issue with file descriptors .

在 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 秒,如果 重复True . 如果 exitTrue ,调用 _exit() 在转储回溯之后,状态为1。(音符 _exit() 立即退出进程,这意味着它不进行任何清理,如刷新文件缓冲区。)如果函数被调用两次,新的调用将替换以前的参数并重置超时。计时器的分辨率为亚秒。

这个 file 必须保持打开状态,直到回溯被倾倒或 cancel_dump_traceback_later() 被称为:见 issue with file descriptors .

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

在 3.7 版更改: 此功能现在始终可用。

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

faulthandler.cancel_dump_traceback_later()

取消上次调用 dump_traceback_later() .

在用户信号上转储跟踪

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

注册用户信号:为 symbol 用于转储所有线程或当前线程的跟踪的信号,如果 all_threadsFalse 进入 file . 如果链为 True .

这个 file 必须保持打开状态,直到信号被 unregister()issue with file descriptors .

在Windows上不可用。

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

faulthandler.unregister(signum)

注销用户信号:卸载 symbol 信号安装人 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