程序接收信号 SIGILL 非法指令

Posted

技术标签:

【中文标题】程序接收信号 SIGILL 非法指令【英文标题】:Program received signal SIGILL Illegal instruction 【发布时间】:2016-06-27 15:53:24 【问题描述】:

我第一次在新机器上运行一个应用程序,但得到:

程序收到信号SIGILL,指令非法

当我这样做时

x/i $pc

我明白了:

=> 0x7fffe98b8f5b <_ZNSt10_HashtableImSt4pairIKmPN4ICE211t_orderInfoEESaIS5_ENSt8__detail10_Select1stESt8equal_toImESt4hashImENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb0ELb0ELb1EEEEC2Ev+

147>:       vmovss 0x84b4d(%rip),%xmm0        # 0x7fffe993dab0

以为机器可能没有 AVX,但检查 proc/cpuinfo 显示 avx 和 avx2 架构都可用。

代码没有在这个盒子上编译,我以前没有用过这个盒子。我在静态和动态链接时遇到问题。

有人知道它可能是什么吗?它是机器上的 C++ 运行时库版本吗?

更新:似乎这是一条 AVX512 指令,这很奇怪。此代码是从 gcc 散列生成的。没有 AVX512 内联汇编。

【问题讨论】:

【参考方案1】:

如果您单击Intel Intrinsics Guide 中的任何功能,则会说vmovss 需要AVX-512F。 AVX 和 AVX-2 还不够。

【讨论】:

好的,谢谢。这完全是奇怪的。我不知道为什么它会生成 AVX512 指令。 编译代码时使用了哪些选项?它们是否包含 -mavx512f-march=native ?编译代码的机器的 CPU 是否支持 AVX-512F? 嗨,只是想找到那个。我在自己的机器上本地构建了这个。它在一个远程盒子上运行,但在另一个远程盒子上给出了这个非法指令。动态和静态构建都会发生这种情况。我们几乎不使用avx2,更不用说avx512了。代码没有改变。我认为它与 gcc/os/kernel 版本有关。 构建代码的机器的 CPU 不支持 avx512

以上是关于程序接收信号 SIGILL 非法指令的主要内容,如果未能解决你的问题,请参考以下文章

Linux学习_signal信号说明

signal常用信号

Debug系列SIGILL(Illegal instruction)问题定位

Debug系列SIGILL(Illegal instruction)问题定位

Linux 信号详解

glBindFramebuffer 上的标志