代码之家  ›  专栏  ›  技术社区  ›  Carson McNeil

glDebugMessageCallback导致segfault

  •  7
  • Carson McNeil  · 技术社区  · 7 年前

    我注册了一个调试回调函数:

    static void APIENTRY openglCallbackFunction(
      GLenum source,
      GLenum type,
      GLuint id,
      GLenum severity,
      GLsizei length,
      const GLchar* message,
      const void* userParam) {
      (void)source; (void)type; (void)id;
      (void)severity; (void)length; (void)userParam;
      fprintf(stderr, "%s\n", message);
      if (severity==GL_DEBUG_SEVERITY_HIGH) {
        fprintf(stderr, "Aborting...\n");
        abort();
      }
    }
    

    this->window = glfwCreateWindow(this->winx, this->winy, "Cortex Stretcher", NULL, NULL);
      if(this->window == NULL) {
        fprintf(stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n" );
        glfwTerminate();
        return -1;
      }
      glfwMakeContextCurrent(this->window);
    
      GLint flags; glGetIntegerv(GL_CONTEXT_FLAGS, &flags);
      if (flags & GL_CONTEXT_FLAG_DEBUG_BIT)
      {
         cout << "Debug output enabled!" << endl;
         glEnable(GL_DEBUG_OUTPUT);
         glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
         glDebugMessageCallback(openglCallbackFunction, nullptr);
        //  glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE);
      }
    

    glDebugMessageCallback(openglCallbackFunction, nullptr); 然后我的代码运行时没有任何错误(除了我的模型渲染不正确,这就是我尝试调试的原因)。

    注: glGetString(GL_VERSION)

    1 回复  |  直到 7 年前
        1
  •  8
  •   derhass    7 年前

    您使用哪种GL加载机制?您的代码确实创建了一个上下文并使其成为当前上下文,但您从未加载任何GL函数指针。典型的 gl.h 标题将仅包含GL 1.1之前的GL函数,并且这些函数也是您可以依赖的OpenGL库以独立于平台的方式导出的唯一函数。编译器(和链接器)没有抱怨 glDebugMessageCallback 指示您使用一些GL加载程序,如glew、glad或其他。这些函数通常通过为每个GL函数声明一个函数指针来工作,该函数初始化为 NULL