【问题标题】:Should executable generated by VS2010 on different platforms differ?VS2010在不同平台上生成的可执行文件应该不同吗?
【发布时间】:2014-01-09 14:33:38
【问题描述】:

我在 Visual Studio 2010 v10.0.40219.1 SP1Rel 下有一个大型 C++ 项目,我开始在我们的一个回归测试中看到一个错误。当我在开发机器上检查错误时,我无法让它发生,所以我将 exe 从测试机器复制到开发机器,错误就出现了。然后我从测试机器中删除了包含项目的源代码树,从开发机器复制它们,在测试机器上清理并重建它们,错误仍然存​​在。所以基本上,在我的开发 PC 上从相同的项目和配置构建的可执行文件,使用相同的编译器版本和安装的修补程序构建,与在测试 PC 上构建的可执行文件不同。唯一的区别是开发 PC 运行的是 Windows 7 64,而测试 PC 运行的是 XP。我还检查了所有链接的 LIB 和 DLL 在两个构建平台上都相同。

如果相同的可执行文件在不同的 PC 上产生不同的结果,我猜这是我的代码中某种特定于平台的错误,但相同的可执行文件在不同的 PC 上表现一致,只是在 XP 上编译的那些表现不同那些在 W7 64 上编译的。

有什么想法吗?

编辑 在测试机器上的调试配置中重新构建代码,错误就消失了。目前正在将源代码树和工具复制到空白的 XP 和 W7 电脑上,以查看问题是否与构建平台有关,或者特定于当前使用的其中一台电脑。

Edit2 将源代码树复制到两台新 PC、一台 XP、一台 Windows7 和重建。只有在 XP 版本上构建时,Exe 才会出现错误。在 XP 调试版本中不会发生,仅在优化发布版本中发生。 Win 7 构建在 XP 和 Win 7 上运行良好,XP 构建在 XP 和 Win 7 上显示错误。将花费一些时间尝试更好地隔离错误以找出究竟发生了什么,但似乎肯定存在编译差异基于构建平台。

Edit3问题确实是一个未初始化的变量,或者更准确地说是模板中未初始化的结构,类似于;

template<class TYPE>class MyTemplateClass 
{
public:
  assign(TYPE &x) { x = t; }

  TYPE t;
}

4 级警告似乎没有发现这一点。

【问题讨论】:

  • 是静态链接 MFC 和 Stingray GUI 库。有一些第 3 方库和 DLL,但它们在两个平台上的版本相同。我要去调查测试 PC 上的问题,看看我是否能弄清楚到底发生了什么。这是一个问题,因为我们通常基于测试 PC 构建版本。
  • 抱歉,因为我重读了这个问题,发现它已经回答了,所以我拉了这个问题。
  • 有几种可能性,我认为这不像 32 位与 64 位问题那样明显,尤其是因为您可能正在 W7 64 上编译 32 位可执行文件以供使用在 XP 盒子上。它可能是不同版本的 MFC,甚至是更奇怪的东西。你有最小的测试用例吗?
  • 不幸的是,目前还没有最小的测试用例。我将在 XP 测试 PC 上构建一个调试版本,希望能生成一个。
  • 你是在开发机上构建然后在测试机上测试的吗?你怎么知道它不是特定于测试机器的东西,比如不同的 dll 版本?您是否查看了加载的模块列表并比较了开发和测试机器上的版本?

标签: c++ visual-studio-2010 build-process


【解决方案1】:

您是否比较过二进制可执行文件?这可以在命令行上使用fc /b file1 file2 (see here) 完成。这至少可以验证您是否正在生成相同的程序,并且在生成的可执行文件之外没有遇到奇怪的事情。

可能/可能有一些静态库正在编译,并且可能还有其他 .h 文件不属于您的代码。这些总是有可能有错误。确保您的库和 SDK 版本相同,而不仅仅是编译器。如果可能,请尝试更新它们。

如果错误随着不同的编译器标志而消失,那么您的程序工作/失败可能是某些未定义行为的结果(例如未初始化的变量)。确保启用所有编译器的警告标志以帮助找到这些标志。不幸的是,Visual Studio 在错误和警告消息方面并不是最好的,但它们仍然很有帮助。

【讨论】:

  • 二进制文件不同,在 15mb 的 exe 上,在 XP 上生成的二进制文件大约大 500 字节,FC 从偏移量 x128 开始喷出很多差异。
  • 所有编译器设置应该相同,因为使用的是同一个项目文件。标题也应该与我昨天在空白的 XP 和 WIN7 盒子上完整安装整个工具链并得到相同的结果相同。我将对 exe 进行依赖性检查,看看会显示什么。
  • 两个版本的静态依赖遍历给出了相同的结果,但显示“未找到至少一个延迟加载依赖模块”和“由于缺少导出功能,至少一个模块具有未解析的导入”一个依赖于延迟负载的模块。我会尝试一个异形的动态步行。
  • 当在依赖 walker 下分析发布版本时,该错误消失了。使用 -w4 重建所有显示没有未初始化的变量,但很容易有一些隐藏的 malloc 提供未初始化的内存。需要做更多的工作。
  • @ShaneMacLaughlin 有一些代码/程序分析工具可以使用。我只尝试使用 valgrind 来查找内存泄漏,Oracle DB 库使这些泄漏完全无法使用。我相信你可以通过谷歌找到其他人,这里有一个线程 stackoverflow.com/questions/93260/… 。有没有可以尝试 VS 2012、2013 或其他编译器的计算机?
猜你喜欢
  • 2015-06-21
  • 1970-01-01
  • 2012-08-06
  • 2018-11-11
  • 1970-01-01
  • 2015-07-22
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
相关资源
最近更新 更多