我有一个程序在不受支持的硬件上使用Tensorflow,所以每次运行它时,我都会收到“非法指令(内核转储)”错误
我的主要目标是捕获这个错误。我不想解决它。
这个错误没有输出到我的程序的stderr,而是输出到bash的stderr。
则我的程序存在,代码为33792,即132(SIGILL)
我无法使用前面提到的here方法捕获它,因为我使用docker run
运行命令,无法将它传递给大括号
有没有什么方法可以捕获没有花括号的bash的stdout?
还有SIGILL到底是如何生成的?幕后到底发生了什么?SIGILL是在父进程中触发的(在我的例子中是bash)并传递给子进程(我的程序)?还是反之亦然?
我试着在我的程序中添加一个SIGILL处理程序,看看我是否可以捕获它,但是我的程序冻结了,而不是打印“非法指令”错误。
我用的是Debian 11,我的程序是用python写的。
编辑:SIGILL杀死了我的python程序,我的目标是从我的程序内部捕获SIGILL,打印一些错误,然后杀死我的程序。
我不希望打印的(非法指令)错误打印在bash的stderr中,我希望它打印到我的程序的stderr或stdout中。
编辑:下面是代码中的sigill处理程序
def sigill_handler(sig, frame):
print("Illegal Instruction. terminating.")
signal.signal(signal.SIGILL, sigill_handler)
请注意,这是我在代码中处理的唯一信号
1条答案
按热度按时间gojuced71#
引用https://docs.python.org/3/library/signal.html:
Python信号处理程序的执行
Python信号处理程序不会在低级(C)信号处理程序内部执行,而是由低级信号处理程序设置一个标志,通知虚拟机在稍后执行相应的Python信号处理程序(例如在下一个字节码指令)。
***捕捉同步错误(如SIGFPE或SIGSEGV)是没有意义的,它们是由C代码中的无效操作引起的。Python将从信号处理程序返回到C代码,这很可能再次引发相同的信号,导致Python明显挂起。**从Python 3.3开始,你可以使用faulthandler模块来报告同步错误。
根据https://docs.python.org/3/library/faulthandler.html,faulthandler所能做的就是转储堆栈跟踪,因此它对您的需求没有帮助。
您可以做的是从自己的 Package 程序运行可能失败的程序,在 Package 程序中可以检查等待状态,并决定在程序被
SIGILL
终止时向用户显示什么。在使用任何tensorflow函数之前,最好检查您的程序是否在支持的平台上运行。