faulthandler转储Python回溯

版本3.3中的新功能.


该模块包含显式转发Python跟踪,故障,超时或用户信号转储的函数。调用faulthandler.enable()SIGSEGV, SIGFPE,SIGABRT, SIGBUSSIGILL信号安装故障处理程序。您也可以通过设置PYTHONFAULTHANDLER环境变量或使用-X faulthandler命令行选项来启动它们.

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

故障处理程序在灾难性情况下被调用,因此只能使用信号安全功能(例如,它不能在堆上分配内存)。由于这个限制,与普通的Pythontracebacks相比,traceback dumping是最小的:

  • 只支持ASCII。backslashreplace错误处理程序用于oncoding.
  • 每个字符串限制为500个字符.
  • 仅显示文件名,功能名称和行​​号。(无源代码)
  • 限制为100帧和100个线程
  • 顺序颠倒:最近的呼叫先显示

默认情况下,Python回溯写入sys.stderr。对于seetracebacks,应用程序必须在终端中运行。一个日志文件可以选择传递给faulthandler.enable().

该模块是用C实现的,所以可以在崩溃时转储回溯,或者什么时候挂起死锁.

转移回溯

faulthandler.dump_tracebackfile=sys.stderr, all_threads=True

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

更改版本3.5:添加了对文件描述符传递给该函数的支持.

故障处理程序状态

faulthandler.enablefile=sys.stderr, all_threads=True

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

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

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

版本3.6更改:Windows上,还安装了Windows异常处理程序.

faulthandler.disable ()

禁用错误处理程序:卸载信号处理程序安装在enable().

faulthandler.is_enabled

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

超时后转移回溯

faulthandler.dump_traceback_latertimeout, repeat=False, file=sys.stderr, exit=False

超时后转储所有线程的回溯timeout秒,如果timeout的话repeatTrue。如果exitTrue,请在转储回溯后调用_exit(),状态= 1。(注意_exit()立即退出进程,这意味着它不会像刷新文件缓冲区那样执行任何清理。)如果函数被调用两次,则newcall将替换先前的参数并重置超时。计时器具有亚秒级分辨率.

file必须保持打开,直到回溯或cancel_dump_traceback_later()被称为:见filedescriptors的问题.

此函数是使用监视程序线程实现的,因此如果Python编译时禁用了线程,则该函数不可用.

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

faulthandler.cancel_dump_traceback_later()

取消上次调用dump_traceback_later().

将回溯转储到用户信号

faulthandler.registersignum, file=sys.stderr, all_threads=True, chain=False

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

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

在Windows上不可用.

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

faulthandler.unregistersignum

取消注册用户信号:卸载signum信号由register()。返回True如果信号已经注册,False否则

在Windows上不可用

用文件描述符

enable(), dump_traceback_later()register()保存文件他们的描述file论点。如果文件已关闭,其文件描述符被新文件重用,或者os.dup2()用于替换文件描述符,将traceback写入不同的文件。每次更换文件时再次调用这些功能.

示例

在启用和不启用faulthandler的情况下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 faultCurrent 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

评论被关闭。