仅发布中的错误

Posted

技术标签:

【中文标题】仅发布中的错误【英文标题】:Bug in Release only 【发布时间】:2013-12-12 06:40:45 【问题描述】:

我正在使用 Microsoft Visual Studio Express 2013。我有一个包含 3 个项目的解决方案。 1 个静态库和两个引用该库的项目。当 ONLY 库的优化设置为 /O2 时,我的游戏中出现了一些奇怪的错误。当我禁用优化时,仅针对库,它的运行方式与调试时完全相同。这是什么原因造成的,我该如何解决?

【问题讨论】:

更多细节请。你到底得到了什么行为?能否隔离出导致问题的部分代码(请提供) 是的,请提供更多详细信息。有什么错误信息吗? 我所有的代码都在这里github.com/kinglime/SFML2?files=1 发生的是,它不会抛出任何致命错误。它实际上可以运行,但问题是它的结果与调试时完全不同。 构建之间的行为差​​异通常是由于未初始化的数据。 混合调试和发布模块意味着您将获得不同的堆和内存分配器。由一个模块分配并由另一个模块释放的内存将以各种有趣的方式失败。尽量与 all 调试或 all 版本保持一致。 【参考方案1】:

您可能有未初始化的变量,这些变量在调试模式下由编译器自动初始化,而不是在发布模式下。

此外,您可能会面临对齐问题和轻微的内存溢出,由于没有优化,您在调试模式下会受到保护,但是当启用优化并且您的代码以不同方式对齐时,这可能会导致问题和未定义的行为。

尝试确保所有变量都已显式初始化,并且假设:

int i;
is the same as int i = 0;

【讨论】:

MSVC 在检测调试构建中未初始化的局部变量使用方面做得非常好(调试构建默认启用/RTC1 选项)。但是,检测不是 100%。并且调试版本中未初始化的堆内存和局部变量充满了确定性值,但如果在没有被覆盖或被释放后使用这些值,这些值通常会导致“快速失败”(而不是隐藏问题)。见***.com/a/370362/12711 我认为假设编译器将某些值填充到未初始化的变量是非常危险的做法。静态分析工具通常会将此作为一个问题提出,因为这种行为可能会在编译器、版本、操作系统等之间发生变化......有一个 var>0 的测试,它可能会工作一次,而不能再次工作。 MSVC 实际上用预先确定的值填充动态分配的内存缓冲区,AFAIK 它没有用好的值未初始化的变量填充。 MSVC 在调试模式下对未初始化的变量/内存所做的事情并不是要依赖的东西——初始化值旨在引起问题,从而暴露错误。 /RTC1 检查是否使用未初始化的本地变量不仅仅是用 0xCC 填充它们。 /RTC1 实际上为每个初始化为 false 的局部变量保留一个隐藏标志,并在变量初始化时设置为 true,并在每次使用变量时进行检查。如果在使用变量时标志仍然为假,它会调用一个函数,该函数将闯入调试器或导致运行时失败消息。 我要感谢大家。我浏览了我的应用程序并修复了所有未初始化的变量。该程序现在在调试和发布中都能完美运行。

以上是关于仅发布中的错误的主要内容,如果未能解决你的问题,请参考以下文章

“脚本错误。” window.onerror 中的错误仅在 Safari 中

仅出现在归档 Mac OS X 产品中的错误

错误消息“无法加载 XMLHttpRequest。 AngularJS 中的 HTTP 仅支持跨源请求

GTM 中的错误:此语言功能仅支持 ECMASCRIPT_2015 或更好的模式:const 声明

错误:当前子查询表达式仅允许作为配置单元中的 where 子句谓词

Codemagic 错误 无效的加密密钥 - 加密的变量仅适用于创建它们的同一团队中的构建