– 转储Python回溯 – 调试和分析(Python教程)(参考资料)
faulthandler
– 转储Python回溯
版本3.3中的新功能.
该模块包含显式转发Python跟踪,故障,超时或用户信号转储的函数。调用faulthandler.enable()
为SIGSEGV
, SIGFPE
,SIGABRT
, SIGBUS
和SIGILL
信号安装故障处理程序。您也可以通过设置PYTHONFAULTHANDLER
环境变量或使用-X
faulthandler
命令行选项来启动它们.
故障处理程序与Apport或Windows故障等系统故障处理程序兼容处理程序。如果sigaltstack()
功能可用,模块使用替代堆栈作为信号处理程序。这允许它甚至在堆栈溢出时转储跟踪.
故障处理程序在灾难性情况下被调用,因此只能使用信号安全功能(例如,它不能在堆上分配内存)。由于这个限制,与普通的Pythontracebacks相比,traceback dumping是最小的:
- 只支持ASCII。
backslashreplace
错误处理程序用于oncoding. - 每个字符串限制为500个字符.
- 仅显示文件名,功能名称和行号。(无源代码)
- 限制为100帧和100个线程
- 顺序颠倒:最近的呼叫先显示
默认情况下,Python回溯写入sys.stderr
。对于seetracebacks,应用程序必须在终端中运行。一个日志文件可以选择传递给faulthandler.enable()
.
该模块是用C实现的,所以可以在崩溃时转储回溯,或者什么时候挂起死锁.
转移回溯
故障处理程序状态
faulthandler.
enable
(file=sys.stderr, all_threads=True)-
启用故障处理程序:为
SIGSEGV
,SIGFPE
,SIGABRT
,SIGBUS
和SIGILL
信号安装处理程序转储Python回溯。如果all_threads是True
,则为每个正在运行的线程生成回溯。否则,只转储当前线程file必须保持打开,直到故障处理程序被禁用:请参阅文件描述符问题.
在版本3.5中更改:添加了对文件描述符传递给此函数的支持.
faulthandler.
disable
()-
禁用错误处理程序:卸载信号处理程序安装在
enable()
.
faulthandler.
is_enabled
()-
检查故障处理程序是否已启用.
超时后转移回溯
faulthandler.
dump_traceback_later
(timeout, repeat=False, file=sys.stderr, exit=False)-
超时后转储所有线程的回溯timeout秒,如果timeout的话repeat是
True
。如果exit是True
,请在转储回溯后调用_exit()
,状态= 1。(注意_exit()
立即退出进程,这意味着它不会像刷新文件缓冲区那样执行任何清理。)如果函数被调用两次,则newcall将替换先前的参数并重置超时。计时器具有亚秒级分辨率.file必须保持打开,直到回溯或
cancel_dump_traceback_later()
被称为:见filedescriptors的问题.此函数是使用监视程序线程实现的,因此如果Python编译时禁用了线程,则该函数不可用.
在版本3.5中更改:添加了对文件描述符传递给此函数的支持.
faulthandler.
cancel_dump_traceback_later
()-
取消上次调用
dump_traceback_later()
.
将回溯转储到用户信号
faulthandler.
register
(signum, file=sys.stderr, all_threads=True, chain=False)-
注册一个用户信号:为signum信号安装一个处理程序,将所有线程或当前线程的回溯(如果all_threads是
False
)转储到file。如果链是True
.file必须保持打开,直到信号未被
unregister()
:见文件描述符问题.在Windows上不可用.
在版本3.5中更改:添加了对文件描述符传递给此函数的支持.
faulthandler.
unregister
(signum)-
取消注册用户信号:卸载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
评论被关闭。