OpenGL - 启用调试 - 运行时 System.AccessViolationException

Posted

技术标签:

【中文标题】OpenGL - 启用调试 - 运行时 System.AccessViolationException【英文标题】:OpenGl - enable debugging - runtime System.AccessViolationException 【发布时间】:2019-11-22 14:29:58 【问题描述】:

我已经阅读了多篇关于启用 glDebugMessageCallback 的文章,但我没有收到任何编译错误。但是,当我运行程序时,我在 glDebugMessageCallback 调用上得到了运行时 System.AccessViolationException。我在我的设置中使用 GLEW 和 GLFW。

当我运行 GlewInfo 时,我可以看到调试可用:

GL_ARB_debug_output:                                           OK 
--------------------
- glDebugMessageCallbackARB:                                   OK
- glDebugMessageControlARB:                                    OK
- glDebugMessageInsertARB:                                     OK
- glGetDebugMessageLogARB:                                     OK

GL_KHR_debug:                                                  OK 
-------------
- glDebugMessageCallback:                                      OK
- glDebugMessageControl:                                       OK
- glDebugMessageInsert:                                        OK
- glGetDebugMessageLog:                                        OK
- GL_KHR_no_error:                                               MISSING 

在我的代码中,我在创建窗口之前设置了 glfw 窗口提示:

if (get_debug_gl())

   glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);

我尝试通过以下方式启用调试:

if (get_debug_gl())
    
        glEnable(GL_DEBUG_OUTPUT);

        if (GLEW_KHR_debug)
        
            gl_log_debug("KHR_debug extension found\n");
            GLDEBUGPROC p = &(debug_gl_callback);
            ///glDebugMessageCallback(p, NULL); /// @todo GRRRRR : this throws runtime System.AccessViolationException
            glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
            gl_log_debug("debug callback enabled\n");
        
        else if(GL_ARB_debug_output)
        
            gl_log_debug("GL_ARB_debug_output extension found\n");
            GLDEBUGPROC p = &(debug_gl_callback);
            glDebugMessageCallbackARB(p, NULL); /// @todo GRRRRR : this throws runtime System.AccessViolationException
            gl_log_debug("debug callback enabled\n");
            glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
        
        else
        
            gl_log_debug("KHR_debug extension NOT found\n");
        
    

观察:

GLEW_KHR_debug 是假的,尽管 glewinfo 报告它应该是真的。如果我绕过它,我会收到运行时错误 如果我通过 glDebugMessageCallbackARB 调用运行代码,我会得到相同的运行时错误。

那里的任何人都可以给我一个关于我缺少什么的提示吗?编写没有消息的 OpenGL 就像开车带着眼罩。

【问题讨论】:

相对于上面的代码,你在哪里初始化 GLEW?您使用的是当前的 GLEW2 版本,还是仍使用核心配置文件中损坏的 GLEW1.x? @derhass 你成功了。我有 glewInit(); call 下面尝试设置回调。谢谢! 【参考方案1】:
glewInit();

必须在之前调用

if (get_debug_gl())
    
        glEnable(GL_DEBUG_OUTPUT);
...

【讨论】:

以上是关于OpenGL - 启用调试 - 运行时 System.AccessViolationException的主要内容,如果未能解决你的问题,请参考以下文章

在哪里可以找到“启用非托管代码调试”以便能够在系统运行时编辑代码?

将正在运行的 OpenGL 附加到 NSight 以进行图形调试

启用 DEPTH_TEST 时 OpenGL 屏幕闪烁

启用远程调试时禁用导航超时

如何确定是不是启用了“调试模式”

启用深度测试时的二维文本工件 Opengl