释放模式下的OpenGL粉红色

时间:2018-10-12 00:32:24

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

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

IDE:Visual Studio 2013(更新5)

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

发布:img

调试:img

1 个答案:

答案 0 :(得分:1)

您最有可能从未初始化的内存中读取数据。为了帮助调试此类问题,在 debug 构建中,运行时库(以及依赖于编译器工具链的编译器)会插入代码,并用 canary值填充所有内存分配。模式。这些模式可能显示在超出范围的读取中,或者显示在未初始化的内存中。同样,完整性检查代码会测试完整性模式,以测试越界写入。

由于在当前广泛使用的计算机体系结构上,内存保护只能以一定的粒度(即页面大小)工作,在大多数情况下为4096字节¹,才能检测到那些金丝雀值。

>

无论如何,您在 debug release 版本中看到不同值的原因是,每种情况下的内存实际初始化方式不同,并且显示。 对您而言重要的是,由于显示出差异,因此您的代码执行了某些错误操作,即您必须修复一个错误!

如果要为Linux构建此程序,我的建议是通过Valgrind memory debugger运行程序。 Valgrind是专门用于调试此类错误的工具。可以通过在仿真的CPU上运行代码,跟踪每个内存分配和访问权限,并告诉您发生非法访问的源代码行来大致工作。

关于Valgrind替代Windows开发的问题解答:Is there a good Valgrind substitute for Windows?


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