工作程序在“清洁机器”上出现非法指令错误?

Posted

技术标签:

【中文标题】工作程序在“清洁机器”上出现非法指令错误?【英文标题】:Working program gets an Illegal instruction fault on 'clean machine'? 【发布时间】:2010-02-11 21:44:27 【问题描述】:

我有一个程序可以在我的开发机器上正常运行,但在只复制了必要文件的“干净机器”上测试时会产生非法指令错误。

该程序由我的共享库组成,该库由 C++ 源代码和一个 C 包装示例程序组成,该示例程序演示了库的使用。在开发机器上,所有这些都内置在 Eclipse w/g++ 中,并且 Debug 和 Release 都可以正常工作。链接了许多标准库。

为了测试我可能遗漏的依赖项,我将 .c 文件、库的 .so 文件和库 .h 文件复制到了全新的 Linux 安装中,并使用使用相同版本编译创建的简单脚本编译/链接它们Eclipse 正在使用的选项。两台机器都有g++ 4.3.2。

当我在干净的机器上运行程序时,它会在打印“非法指令”后立即退出。

在 gdb 中运行产生:

(gdb) run
Starting program: /home/sfallows/Source/Apps/MySample/MySample 
[Thread debugging using libthread_db enabled]
[New Thread 0xb5c4ca90 (LWP 7063)]

Program received signal SIGILL, Illegal instruction.
[Switching to Thread 0xb5c4ca90 (LWP 7063)]
0xb7f0cb29 in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at /usr/include/c++/4.3/iostream:77
77   static ios_base::Init __ioinit;
Current language:  auto; currently c++
(gdb) bt
#0  0xb7f0cb29 in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at /usr/include/c++/4.3/iostream:77
#1  0xb7f0cb48 in global constructors keyed to _ZN8NodeLockC2Ev () at ../NodeLock.cpp:194
#2  0xb7f204ad in __do_global_ctors_aux () from /home/sfallows/Source/Apps/MySample/libMyLib.so
#3  0xb7ee5c80 in _init () from /home/sfallows/Source/Apps/MySample/libMyLib.so
#4  0xb7fe1de4 in ?? () from /lib/ld-linux.so.2
#5  0x00000001 in ?? ()
#6  0xbf8e6b74 in ?? ()
#7  0xbf8e6b7c in ?? ()
#8  0x00000007 in ?? ()
#9  0xbf8e6b2c in ?? ()
#10 0x00000001 in ?? ()
#11 0x00000001 in ?? ()
#12 0xb7feeff4 in ?? () from /lib/ld-linux.so.2
#13 0x00000000 in ?? ()
(gdb) Quit

我不确定它为什么在 NodeLock.cpp 中运行静态构造器。我在该文件中既没有任何静态/全局对象,也没有该类的任何静态/全局对象。

开发机器是 Intel Core2 Quad,干净机器是 Pentium 4 Dual。我假设 g++ 默认使用 x86 指令的公共子集,并且处理器差异不是我的问题。

任何其他看什么的建议表示赞赏。我试图避免在干净的机器上安装所有库源和依赖项。

对于 rmn 的回答和 John Boker 的评论:在 Windows 世界中,exe 和 dll 在过多的 Intel 和 AMD 处理器上运行,因此显然存在广泛使用的通用指令子集。我以为 gcc 也会这样做?我想我会全面研究指令集/架构选项。

【问题讨论】:

什么是错误指令? 你知道他们对假设事物的看法。 helmet-stickers.com/xcart/product.php?productid=2604 +1 用于编译为通用 386/486/Pentium 代码。此外,您可能想比较两台机器上 ldconfig 的输出 【参考方案1】:

您可以尝试为 i686 架构显式编译(使用 gcc 的 -march=i686 选项)。以防万一您的编译器生成了一些特定于 Core2 的指令...

【讨论】:

【参考方案2】:

引用:“开发机器是 Intel Core2 Quad,干净机器是 Pentium 4 Dual。我假设 g++ 默认使用 x86 指令的公共子集,处理器差异不是我的问题。”

我确实认为这是一个问题。尝试专门为该机器编译或在干净的机器上重新编译,或者获得两台相同的机器。 - 这些是我的 0.02 美元。

此外,您似乎在加载 ld-linux.so 时快要死了。可能是linux版本不同?

【讨论】:

两台机器都是从同一张 DVD 安装的 Debian 5.03。【参考方案3】:

我能想到一些你可以尝试的方法:

    您是否使用了超出 -O3 的任何优化?可能旧系统不支持。 您可能已经检查过这个,但是您是否检查过您系统上的二进制文件与目标系统的 md5? 您的库是否进行了多线程处理?如果是这样,由于核心数不同,那么您可能在某个地方遇到了竞争条件

【讨论】:

【参考方案4】:

你在静态初始化中死了。完成事情的顺序是特定于实现的,并且可能因运行时版本而异。这可能是你的问题。两台机器上的libstdc++是一样的吗?

反正那里有交叉依赖是不好的,如果结果是问题,你需要重新编写代码

【讨论】:

以上是关于工作程序在“清洁机器”上出现非法指令错误?的主要内容,如果未能解决你的问题,请参考以下文章

import tensorflow是出现非法指令(核心已转储)

import tensorflow 出现非法指令(核心已转储)

求解Runtime Error 中的sigtrap 是啥错误?

MIPS交叉编译错误:非法指令

关于在oj上出现Runtime error 的情况

在ubuntu17.10中import tensorflow as tf 的py文件执行时会出现‘非法指令’,然后脚本就不能执行下去?