python SIGILL究竟是如何产生的?

vaj7vani  于 2023-02-11  发布在  Python
关注(0)|答案(1)|浏览(150)

我有一个程序在不受支持的硬件上使用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)

请注意,这是我在代码中处理的唯一信号

gojuced7

gojuced71#

引用https://docs.python.org/3/library/signal.html

Python信号处理程序的执行

Python信号处理程序不会在低级(C)信号处理程序内部执行,而是由低级信号处理程序设置一个标志,通知虚拟机在稍后执行相应的Python信号处理程序(例如在下一个字节码指令)。

***捕捉同步错误(如SIGFPE或SIGSEGV)是没有意义的,它们是由C代码中的无效操作引起的。Python将从信号处理程序返回到C代码,这很可能再次引发相同的信号,导致Python明显挂起。**从Python 3.3开始,你可以使用faulthandler模块来报告同步错误。

  • 一个纯C语言实现的长时间运行的计算(比如正则表达式匹配大量文本)可以不间断地运行任意长的时间,而不管接收到什么信号。当计算完成时,Python信号处理程序将被调用。
  • 如果处理程序引发异常,它将在主线程中“凭空”引发。有关讨论,请参见下面的注解。

根据https://docs.python.org/3/library/faulthandler.html,faulthandler所能做的就是转储堆栈跟踪,因此它对您的需求没有帮助。
您可以做的是从自己的 Package 程序运行可能失败的程序,在 Package 程序中可以检查等待状态,并决定在程序被SIGILL终止时向用户显示什么。
在使用任何tensorflow函数之前,最好检查您的程序是否在支持的平台上运行。

相关问题