MS Visual C 释放和调试构建之间的不同行为的可能原因

Possible causes for different behavior between MS Visual C++ release and debug builds

本文关键字:MS 释放 调试 之间 构建 Visual      更新时间:2023-10-16

在开发32位Windows命令行程序时,我们最近遇到了一种情况,在该情况下,调试版本按预期工作,而发行版则在其计算中显示奇数行为,而不是应该。现在,这并不是20年前的罕见问题。对于发行版,编译器优化被打开,即使现在,编译器优化也不确定在所有情况下都可以使用。因此,在过去,如果我们遇到了这个问题,我们会关闭编译器的优化 - 也许是否有选择地,如果速度或空间考虑确实很重要。这次,我们关闭了所有优化,问题仍然存在!调试版本和发布版本之间的唯一区别等于一系列的编译器和加载程序设置。我们返回并更改了发布设置,以尽可能地匹配调试设置,问题仍然存在!我们从未见过的。

这一切都在VC6平台上,我们通常一直在使用32位Windows。这是Microsoft Visual C 6.0。我们对VC6的偏爱是,我们是Microsoft在其C/C 包装上通过VC6的所有版本上的Beta测试仪,并且在调试优化器的调试中非常活跃。但是,由于我们对VC8没有真正的问题,因此我们尝试了。在这种情况下,我们只是让VC8转换了我们一直使用的项目。令我们惊讶的是,VC8显示出完全相同的问题。调试版本有效,发行版本不行。我们可能会尝试在VC8中从头开始创建事物,看看这是否有所作为,但我们宁愿怀疑它不会。在这一点上,我们根本不了解这一点。它必须是我们缺少的地方的编译器开关设置。还是这样?

还有什么可能导致发行版和调试构建之间的区别?

一般而言,您会发现调试可执行文件与以几种方式执行的可执行文件不同。仅通过查看可执行文件的文件大小,这很明显。可能的原因包括

  • 调试可能包含其他代码以进行错误检查
  • 调试通常禁用了优化,而发行版可能具有很高的水平。
  • 调试可能会默认初始化自动变量为零,而发行版完全不会初始化。
  • 调试可以携带其他信息将可执行代码与源代码相关联,而发行版则没有。

我最好的建议是初始化所有变量,即使看起来很愚蠢。验证您的所有内存分配是否有效,并且您在范围中正确自由。

上面的静态分析仪评论是很好的建议。您可以通过使用较新的编译器来获得类似的好处。

看看Cppcheck或许多商业检查员之一。

无论如何,我建议您升级到最新的编译器。

祝你好运。

邪恶。

调试实现可能与他们可能会做的理智检查有关(特别是在不确定的行为时(。

一个不错的例子:使用 std::minstd::max与NAN(请参阅为什么发行/调试对std :: min?min?min?(会产生不同的结果(请参阅我自己的答案,请参见我自己的答案,我分析了该功能实施(。