我有一个非常有趣和令人沮丧的问题。 我工作的公司使用一个应用程序来进行电气工程的模拟和validation。 此应用程序基于随机种子生成输出。 一旦你有一个给定的模拟的随机种子,你可以将这个随机的种子送回到应用程序,你应该得到相同的结果。 不幸的是,我们遇到了不同的Linux发行版给出了不同的结果给定相同的随机种子的问题。 这是有问题的,因为使用这些工具的工程师依靠每次重新产生精确结果的能力。 我应该提到,我们在不同的发行版中使用完全相同的应用程序版本 – 事实上,它是NFS挂载的,所以它每次都进行testing的安装点完全相同。
在这一点上,我正在testing以下操作系统:
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是由软件制造商支持的发行版本,所以在这一点上,我们将看看这两个发行版产生的结果是“正确的”。 在这一点上,我无法find一致的相似或不同之处,告诉我发生了什么事情。 例如,以下是在不同系统上使用的内核版本:
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输出甚至在产生相同输出的分布之间差别很大时,这非常耗时且价值不大。 我不能很好地去应用程序制造商,因为我遇到的问题的平台被列为不受支持,所以他们会告诉我迷路。 任何提示从哪里去追踪问题?
我最后一次遇到这个问题时,两个操作系统是以32位模式还是以64位模式运行,结果是不同的。 (@ kormoc的build议是有用的,因为gdb是我如何隔离它)因为你没有validation这个条件是相同的服务器之间,我build议你开始你的search。
如果架构确实不同,那么可以通过设置具有匹配体系结构的问题操作系统,并确认结果是否再次收敛来确认问题的根源。 这应该为您的开发人员提供足够的信息来实现独立于平台的种子。