faulthandler
---转储python回溯¶
3.3 新版功能.
此模块包含一些函数,可以在出现故障、超时或用户信号时显式转储python跟踪。调用 faulthandler.enable()
为安装故障处理程序 SIGSEGV
, SIGFPE
, SIGABRT
, SIGBUS
和 SIGILL
信号。您还可以通过设置 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_threads 是
False
,仅转储当前线程。在 3.5 版更改: 添加了对将文件描述符传递到此函数的支持。
故障处理程序状态¶
- faulthandler.enable(file=sys.stderr, all_threads=True)¶
启用故障处理程序:安装
SIGSEGV
,SIGFPE
,SIGABRT
,SIGBUS
和SIGILL
用于转储python跟踪的信号。如果 all_threads 是True
,为每个正在运行的线程生成跟踪。否则,只转储当前线程。这个 file 必须保持打开状态,直到禁用故障处理程序:请参见 issue with file descriptors .
在 3.5 版更改: 添加了对将文件描述符传递到此函数的支持。
在 3.6 版更改: 在Windows上,还安装了Windows异常处理程序。
- faulthandler.is_enabled()¶
检查故障处理程序是否已启用。
超时后转储跟踪¶
- faulthandler.dump_traceback_later(timeout, repeat=False, file=sys.stderr, exit=False)¶
在超时后转储所有线程的跟踪 timeout 秒,或每 timeout 秒,如果 重复 是
True
. 如果 exit 是True
,调用_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_threads 是
False
进入 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