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

问题描述 投票:0回答:1

我正在使用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: %s\nGL error id: %i\n", message, errorID);
#if _MSC_VER
            __debugbreak();
#endif
        }break;

        case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
        {
            BGZ_CONSOLE("GL deprecated gl function usage error: %s\nGL error id: %i\n", message, errorID);
#if _MSC_VER
            __debugbreak();
#endif
        }break;

        case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
        {
            BGZ_CONSOLE("GL undefined behavior error: %s\nGL error id: %i\n", 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]

所以我的代码没有任何执行树可查 有什么方法可以让这个程序正常工作吗?

c++ visual-studio debugging opengl opengl-3
1个回答
3
投票

你必须启用同步调试输出。

glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);

如果... 调试输出 是异步产生的,那么调试回调函数可以从执行命令的线程之外的线程调用。参见 伐木glEnable.

© www.soinside.com 2019 - 2024. All rights reserved.