发布模式下的 OpenGL 粉红色
OpenGL pink color in release mode
OpenGL 在调试模式下显示颜色为 white 的空纹理,在发布模式下颜色为 pink,关键仅在运行时库中不同 (发布:MT,调试:MTd)。
IDE:Visual Studio 2013(更新 5)
问题 - 为什么会发生以及如何解决?
发布:
调试:
您很可能是从未初始化的内存中读取数据。为了帮助调试此类问题,在 debug 构建中,运行time 库(以及取决于编译器工具链的编译器)插入代码,用 金丝雀值 模式。这些模式可能出现在越界读取或未初始化的内存中。类似地,健全性检查代码测试完整性模式以测试越界写入。
由于在当前广泛使用的计算机体系结构上,内存保护仅在特定粒度下起作用,即 页面大小,在大多数情况下为 4096 字节¹,以检测内存损坏那些金丝雀值被使用了。
无论如何,您在 debug 和 release 构建中看到不同值的原因是,内存实际上被不同地初始化,对于每种情况,都会出现。 对你来说重要的是,因为出现了差异,你的代码做错了,即你有一个必须修复的错误!
如果您是为 Linux 构建此程序,我的建议是 运行 通过 Valgrind memory debugger 您的程序。 Valgrind 是专门为调试此类错误而设计的工具。它的工作原理大致是 运行 通过模拟 CPU 连接您的代码,跟踪每一个内存分配和访问,告诉您一直到源代码行,非法访问发生的位置。
关于 Windows 开发的 Valgrind 替代品的 SO 问答:Is there a good Valgrind substitute for Windows?
1:大页面(通常为 2MiB)和千兆页面(通常为 1GiB)也经常可用,但除非您明确要求,否则它只是标准页面大小。
OpenGL 在调试模式下显示颜色为 white 的空纹理,在发布模式下颜色为 pink,关键仅在运行时库中不同 (发布:MT,调试:MTd)。
IDE:Visual Studio 2013(更新 5)
问题 - 为什么会发生以及如何解决?
发布:
调试:
您很可能是从未初始化的内存中读取数据。为了帮助调试此类问题,在 debug 构建中,运行time 库(以及取决于编译器工具链的编译器)插入代码,用 金丝雀值 模式。这些模式可能出现在越界读取或未初始化的内存中。类似地,健全性检查代码测试完整性模式以测试越界写入。
由于在当前广泛使用的计算机体系结构上,内存保护仅在特定粒度下起作用,即 页面大小,在大多数情况下为 4096 字节¹,以检测内存损坏那些金丝雀值被使用了。
无论如何,您在 debug 和 release 构建中看到不同值的原因是,内存实际上被不同地初始化,对于每种情况,都会出现。 对你来说重要的是,因为出现了差异,你的代码做错了,即你有一个必须修复的错误!
如果您是为 Linux 构建此程序,我的建议是 运行 通过 Valgrind memory debugger 您的程序。 Valgrind 是专门为调试此类错误而设计的工具。它的工作原理大致是 运行 通过模拟 CPU 连接您的代码,跟踪每一个内存分配和访问,告诉您一直到源代码行,非法访问发生的位置。
关于 Windows 开发的 Valgrind 替代品的 SO 问答:Is there a good Valgrind substitute for Windows?
1:大页面(通常为 2MiB)和千兆页面(通常为 1GiB)也经常可用,但除非您明确要求,否则它只是标准页面大小。