2017-08-08 4 views
-1

Je suis dans un peu un catch-22 ici. Je ne peux pas déboguer mon programme C++ OpenGL parce que l'activation des messages de débogage provoque un segfault.glDebugMessageCallback provoque la segfault

J'ai une fonction de rappel de débogage I Registre:

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(); 
    } 
} 

Et je lance le contexte de débogage dans le code suivant:

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); 
    } 

Si je commente simplement sur glDebugMessageCallback(openglCallbackFunction, nullptr); alors mon code fonctionne sans des erreurs (mis à part mon rendu incorrect du modèle, c'est pourquoi j'essaye de déboguer).

Mais si j'essaie d'enregistrer le rappel, alors mon code se sépare (à l'enregistrement). Une idée pourquoi? C'est essentiellement du code copié-collé.

Remarque: glGetString(GL_VERSION) retours 4.5.0 NVIDIA 375,39

+2

'glDebugMessageCallback' est uniquement disponible dans OpenGL> 4.3. Votre message d'erreur me fait penser que vous utilisez OpenGL 3.3 ou 2.1, qui ne supportent pas cela. – BDL

+0

Ce n'est pas le cas. Si j'imprime 'glGetString (GL_VERSION);' Je reçois 4.5.0 NVIDIA 375.39. J'utilise un Titan X. –

Répondre

2

Quel genre de mécanisme GL de chargement utilisez-vous? Votre code crée un contexte et le rend actuel, mais vous ne chargez jamais les pointeurs de fonction GL. L'en-tête gl.h typique ne contiendra que les fonctions GL jusqu'à GL 1.1, et celles-ci sont également les seules que vous pouvez compter pour être exportées par votre bibliothèque OpenGL indépendamment de la plate-forme. Le fait que votre compilateur (et éditeur de liens) ne se plaint pas de glDebugMessageCallback indique que vous utilisez un chargeur GL comme glew, content, ou quoi que ce soit. Ceux-ci fonctionnent généralement en déclarant un pointeur de fonction pour chaque fonction GL, qui sont initialisés à NULL, et seront chargés après avoir appelé une fonction d'initialisation. Puisque vous ne faites pas une telle chose avant d'essayer de définir le rappel de débogage, vous appelez simplement un pointeur NULL.

+1

Ah, j'utilise en effet glew. Je comprends ce qu'il fait maintenant, mais je n'ai pas au moment où j'ai posté cette question, et vous avez totalement raison, mon installation de débogage est appelée avant que j'initialise glew! Je vous remercie! –