2013-12-20 29 views
4

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

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

任何想法,为什么这应该是?

编辑在测试机器上的调试配置中重新构建代码,并且错误消失。目前将源代码树和工具复制到空白的XP和W7中,查看问题确实遵循构建平台,还是特定于当前正在使用的其中一台PC。

编辑2将源代码树复制到两台新PC上,一台XP,一台Windows7并重建。只有在XP版本上构建时,exe才会出现bug。不会在XP调试版本上发生,只会优化发行版本。 Win 7 build在XP和Win 7上运行良好,XP build显示XP和Win 7上的bug。为了更好地隔离错误以找出究竟发生了什么,但似乎存在编译差异基于构建平台。

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

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

    TYPE t; 
} 

警告级别4似乎没有选择它。

+0

是静态链接MFC,还有Stingray GUI库。有一些第三方库和DLL,但它们在两个平台上都是相同的版本。我打算在测试PC上调查问题,看看我能否确定究竟发生了什么。这是一个问题,因为我们通常基于测试PC版本构建发布版。 –

+0

对不起,我抽出了这个问题,因为我重读了这个问题,并且看到它已经回答了。 – OmnipotentEntity

+0

有几种可能性,我认为它不像32位和64位问题那样明显,尤其是因为您可能正在编译W7 64上的32位可执行文件以用于XP盒。它可能是MFC的不同版本,甚至更奇怪。你有一个最小的测试用例吗? – OmnipotentEntity

回答

1

您比较了二进制可执行文件吗?这可以通过命令行fc /b file1 file2see here)完成。这至少会验证你是否制作了相同的程序,并且没有遇到可执行程序以外的奇怪事情。

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

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

+0

二进制文件是不同的,在一个15MB的exe文件上,XP上生成的二进制文件大约500个字节,并且从偏移量x128开始,FC发出大量的差异。 –

+0

所有编译器设置应该相同,因为正在使用相同的项目文件。头部也应该与我昨天在空白的XP和WIN7盒子上完整安装整个工具链一样,并得到相同的结果。我会对exes进行依赖检查,看看显示的是什么。 –

+0

这两个版本的静态依赖性步骤给出了相同的结果,但表示'至少有一个延迟 - 加载依赖项模块未找到','至少有一个模块由于延迟加载相关模块中缺少导出函数而导入了未解析的导入。 “我会尝试一个异形的动态漫步。 –

相关问题