MSVC __debugbreak() 与 openGL 错误回调一起使用时不会产生调用堆栈

MSVC __debugbreak() when used with openGL error callback produces no callstack

本文关键字:堆栈 调用 一起 debugbreak openGL 回调 错误 MSVC      更新时间:2023-10-16

我正在使用openGL最近的glDebugMessageCallback约定来帮助我的openGL错误处理。我希望能够做的是有一种方法可以查看导致 openGL 错误的函数。我认为回调方法的唯一方法是在我的回调函数中插入断点,以便在 Visual Studio 中生成错误时,我可以返回并检查调用堆栈以查看究竟是什么函数导致了问题:

void GLAPIENTRY MyOpenGLErrorCallbackFunc(GLenum source, GLenum debugErrorType, GLuint errorID, GLenum severity, GLsizei length, const GLchar *message, const void *userParam)
{
switch(debugErrorType)
{
case GL_DEBUG_TYPE_ERROR:
{
BGZ_CONSOLE("GL Type error: %snGL error id: %in", message, errorID);
#if _MSC_VER
__debugbreak();
#endif
}break;
case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
{
BGZ_CONSOLE("GL deprecated gl function usage error: %snGL error id: %in", message, errorID);
#if _MSC_VER
__debugbreak();
#endif
}break;
case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
{
BGZ_CONSOLE("GL undefined behavior error: %snGL error id: %in", message, errorID);
#if _MSC_VER
__debugbreak();
#endif
}break;
};
};

但是,当我尝试通过将无效枚举传递给其中一个 openGL 函数来测试这一点时,当程序确实中断时,我所有的调用堆栈都显示:

myProgram.exe!MyOpenGLErrorCallbackFunc(GLenum source, GLenum debugErrorType, GLuint errorID, GLenum severity, GLsizei length, const GLchar *message, const void *userParam)
[External code]

因此,我的代码没有执行树可供查看。有没有办法让它工作?

您必须启用同步调试输出:

glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);

如果调试输出是异步生成的,则可以从执行命令的线程以外的线程调用调试回调函数。请参 阅日志记录和glEnable