C++ glDebugMessageCallback更详细的信息
我到处都读到C++ glDebugMessageCallback更详细的信息,c++,opengl,C++,Opengl,我到处都读到glDebugMessageCallback是获取错误的更好解决方案,所以我实现了它。到现在为止,一直都还不错。我确实得到了更多关于正在发生的事情的详细信息。目前在NVIDIA上,它看起来像这样: 调试日志:在源API中,键入OTHER,id 131185,严重性:无, 消息缓冲区详细信息:缓冲区对象3(绑定到 GL_顶点_属性_数组_缓冲区_绑定_ARB(0),以及 GL\u数组\u缓冲区\u ARB,用法提示为GL\u流\u绘制)将使用视频 内存作为缓冲区对象操作的源 真的很好,
glDebugMessageCallback
是获取错误的更好解决方案,所以我实现了它。到现在为止,一直都还不错。我确实得到了更多关于正在发生的事情的详细信息。目前在NVIDIA上,它看起来像这样:
调试日志:在源API中,键入OTHER,id 131185,严重性:无,
消息缓冲区详细信息:缓冲区对象3(绑定到
GL_顶点_属性_数组_缓冲区_绑定_ARB(0),以及
GL\u数组\u缓冲区\u ARB,用法提示为GL\u流\u绘制)将使用视频
内存作为缓冲区对象操作的源
真的很好,真的-但是,我错过了一件事-我不能在这里指出这到底发生在哪里
如果我对这样的宏使用旧式方法:
\define CHECK\u GL\u ERROR()checklerror(\uuuu FILE\uuuuuu,\uuuuu LINE\uuuuuuu)
和
glGetError()
它的详细程度要低得多,代码也很混乱——但是!我可以更容易地跟踪它到底行还是调用它发生了,至少在调试自己时是这样
当然,如果我将日志级别降低到更严格的级别,那么可能也更容易识别源代码,因为所讨论的函数较少,但是,根据代码,我发现查找特定函数有点不精确
所以我现在的问题是-有没有一种方法可以告诉回调到底触发了什么,函数或者代码中的行,就像在旧方法中一样(也就是说,现在没有添加手动断点/调试)
我会发现这非常方便,尤其是考虑到一种情况,即可能只是在使用该软件的人只能为我无法重现的问题提供日志
PS:有人能告诉我“id”是什么意思吗?我找到了很多教程和解释,也阅读了文档,但我仍然不知道它在调试中有什么用途。有两种方法可以帮助您确定错误的来源: 首先,您可以
glEnable(GL\u DEBUG\u OUTPUT\u SYNCHRONOUS)
,以确保在产生错误的函数范围内抛出错误。现在,当您在错误回调函数中设置断点时,您将看到错误发生的调用堆栈
第二:OpenGL允许您将名称和范围与每个OpenGL对象相关联。这允许您指定缓冲区的名称。查看更多细节。我会考虑使用OpenGL调试器进行调试。调试回调可以提供提示,但您确实需要找到是哪部分代码触发了它。还有一些调用跟踪程序,可以记录您对OpenGL的每次调用,以便以后进行检查。总的来说,我会尽我所能。仅仅因为你使用调试回调并不意味着你不能使用glGetError,反之亦然。我并不反对,但如果我自己不能调试它,并且只能从用户f.e.那里获取报告,我希望拥有最有用和信息最丰富的日志。除此之外,这仍然会使事情变得更容易:)嗨,你成功地获得了“行”吗也可以使用
glDebugMessageCallback
打印?是的,我知道,但目前我想看看如何最大限度地利用“无人参与”日志记录。如果您真的想在日志记录期间知道自己在哪里,您可以自己生成一个stacktrace(取决于编译器的工作方式)。