OpenGL在调试模式下显示空纹理,颜色为白色,在发布模式下显示为粉红色,仅在运行时库中有所不同(发布:MT,调试:MTd)
IDE:Visual Studio 2013(更新5)
问题-为什么会发生以及如何解决?
发布:
调试:
答案 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)也经常可用,但是除非您明确要求,否则它们只是标准页面大小。