【发布时间】: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