不同的Linux发行版产生不同的机器生成代码

不同的Linux发行版产生不同的机器生成代码

我有一个非常有趣和令人沮丧的问题。我工作的公司使用一个应用程序进行电气工程的模拟和验证。此应用程序根据随机种子产生输出。一旦你有了给定模拟的随机种子,你可以将该随机种子反馈给应用程序,你应该得到相同的结果。不幸的是,我们遇到了不同的 Linux 发行版在给定相同随机种子的情况下产生不同结果的问题。这是有问题的,因为使用这些工具的工程师依赖于每次重新生成精确结果的能力。我应该提到我们正在使用确切地不同发行版中的应用程序的同一版本 — — 事实上,它是通过 NFS 安装的,因此每次测试的安装点都是完全相同的。

目前,我正在使用以下操作系统进行测试:

CentOS 5
CentOS 6
SLES 11
openSuSE 11.4
openSuSE 12.1
openSuSE 12.2

我看到的高级结果是 CentOS 5 和 SLES 11 产生相同的结果,而 CentOS 6 和 openSuSE 11.4/12.1/12.2 产生相同的结果。CentOS 5 和 SLES 11 是软件制造商列出的受支持的发行版,因此,此时,我们将这两个发行版产生的结果视为“正确”的结果。目前,我还没有找到一组一致的相似点或差异点来告诉我发生了什么。例如,以下是不同系统上使用的内核版本:

CentOS 5 - 2.6.18
CentOS 6 - 2.6.32
SLES 11 - 3.0.51
openSuSE 11.4 - 2.6.37.6
openSuSE 12.1 - 3.1.10
openSuSE 12.2 - 3.4.11

因此,无需深入研究这些发行版中哪些补丁可能应用于哪些内核版本,我已经可以说,2.6 和 3.0 之间的变化并不大,因为 SLES 11 和 CentOS 5 产生的结果一致,但主要内核版本不同。我也研究了 glibc,但发现 openSuSE 11.4 和 SLES 11 的 glibc 软件包版本非常接近(2.11.3)。

我的问题是:我应该去哪里寻找下一个可以追踪这个问题的地方?我已经开始获取 strace 输出并尝试进行比较,但这非常耗时,而且当 strace 输出即使在产生相同输出的发行版之间也有很大差异时,这样做没有什么价值。我无法很好地联系应用程序制造商,因为我遇到问题的平台被列为不受支持,所以他们只会告诉我滚开。有什么提示可以告诉我从哪里开始追踪问题?

答案1

上次我遇到这个特定问题时,结果发现两个操作系统是在 32 位模式还是 64 位模式下运行存在差异。(@kormoc 的建议很有用,gdb我隔离它的方式也很有用)由于您没有验证服务器之间的这种情况是否相同,我建议您从那里开始搜索。

如果架构确实不同,您可以通过设置一个具有匹配架构的问题操作系统并再次查看结果是否收敛来确认这是问题的根源。这应该会为您的开发人员提供足够的信息来实现平台独立的种子。

相关内容