【问题标题】:OpenGL pink color in release mode发布模式下的 OpenGL 粉色
【发布时间】:2019-03-17 03:47:12
【问题描述】:

OpenGL 在调试模式下将空白纹理显示为 white,在发布模式下显示为 粉红色,仅在运行时库中键不同(发布:MT,调试:MTd) .

IDE:Visual Studio 2013(更新 5)

问题 - 为什么会发生以及如何解决?

发布:

调试:

【问题讨论】:

  • 您的代码中可能存在某种类型的初始化错误。
  • @drescherjm 我不排除手工错误,但仅在 MT / MTd 的两个版本中真正不同(优化、检查、预处理器相同),但效果如图所示,如果这是初始化错误 - 必须发生在任何运行时库中,对吧?
  • 在调试模式内存中填充了堆栈变量的模式 0xcc。 0xcd 用于堆。这不会在发布中发生。
  • @drescherjm 你是对的!感谢您的快速回答和有用的提示。如果您愿意 - 创建“回复消息”,我将选择它作为最终消息。

标签: c++ visual-studio opengl game-engine


【解决方案1】:

您很可能从未初始化的内存中读取。为了帮助调试此类问题,在 debug 构建中,运行时库(取决于编译器工具链也包括编译器)插入代码,用 canary 值 填充所有内存分配模式。这些模式可能出现在越界读取或未初始化内存中。同样,完整性检查代码会测试完整性模式以测试越界写入。

由于在当前广泛使用的计算机体系结构中,内存保护仅以特定粒度(即页面大小,在大多数情况下为 4096 字节¹)来检测内存损坏,因此使用了这些金丝雀值。 p>

无论如何,您在 debugrelease 构建中看到不同值的原因是,对于每种情况,内存实际上是不同的,并且会显示出来. 对您来说重要的是,因为出现了差异,您的代码会出错,即您有一个必须修复的错误!

如果您要为 Linux 构建此程序,我的建议是通过 Valgrind memory debugger 运行您的程序。 Valgrind 是专门为调试此类错误而设计的工具。它的大致工作原理是通过模拟 CPU 运行您的代码,跟踪每一个内存分配和访问,告诉您到源代码行,哪里发生了非法访问。

有一个关于 Valgrind 替代 Windows 开发的 SO Q&A:Is there a good Valgrind substitute for Windows?


1:大页面(通常为 2MiB)和千兆页面(通常为 1GiB)通常也可用,但除非您明确要求,否则它只是标准页面大小。

【讨论】:

    猜你喜欢
    • 2016-03-19
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多