I originally posted this on the glew-users and glew-coders mailing list last night but have not had any responses:
It appears that ARB_debug_output is not compatible with GLEW due to a chicken and egg problem.
To use ARB_debug_output you have to use the WGL_create_context_profile’s wglCreateContextAttribsARB() to set WGL_CONTEXT_DEBUG_BIT_ARB to get a GL context with the ARB_debug_output extension.
To get WGL_create_context_profile you have to create a dummy window and context, so you can call glewInit() to initialize all the WGL function pointers. Unfortunately as ARB_debug_output does not appear in the extensions string until you use wglCreateContextAttribsARB() to set WGL_CONTEXT_DEBUG_BIT_ARB, the ARB_debug_output’s function pointers are not initialized.
Once you call wglCreateContextAttribsARB() to set WGL_CONTEXT_DEBUG_BIT_ARB and create a debug context, you need to reinitialize GLEW’s pointers so it can now find ARB_debug_output’s function pointers, then you can use ARB_debug_output.
But calling glewInit() a second time will not initialize those pointers as it has already been called before and refuses to initialize twice.
Hence you now have a chicken and egg problem.
One idea I have for a fix, it to expose wglewInit() to non GLEW_MX users (like me). wglewInit() would only initialize the WGL function pointers (so you can use wglCreateContextAttribsARB() to create a debug context). Once you have the debug context, you then call normal glewInit() which would then initialize all the GL extensions including ARB_debug_output. You can then successfully use ARB_debug_output.
Unless of course someone else has a better idea to fix it, or there is a workaround I can use.