glDebugMessageCallback is working fine on my side. The following code might be of your interest. Note that glDebugMessageCallback requires OpenGL > 4.3.
glEnable(GL_DEBUG_OUTPUT);
glDebugMessageCallback([](
GLenum source, GLenum type, GLuint id,
GLenum severity, GLsizei length, const GLchar *message, const void *userParam) {
#pragma GCC diagnostic ignored "-Wswitch"
const char *_source = "Unknown";
switch (source) {
case GL_DEBUG_SOURCE_WINDOW_SYSTEM: _source = "WinSys"; break;
case GL_DEBUG_SOURCE_APPLICATION: _source = "App"; break;
case GL_DEBUG_SOURCE_API: _source = "OpenGL"; break;
case GL_DEBUG_SOURCE_SHADER_COMPILER: _source = "ShaderCompiler"; break;
case GL_DEBUG_SOURCE_THIRD_PARTY: _source = "3rdParty"; break;
case GL_DEBUG_SOURCE_OTHER: _source = "Other"; break;
}
const char *_type = "Unknown";
switch (type) {
case GL_DEBUG_TYPE_ERROR: _type = "Error"; break;
case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: _type = "Deprecated"; break;
case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: _type = "Undefined"; break;
case GL_DEBUG_TYPE_PORTABILITY: _type = "Portability"; break;
case GL_DEBUG_TYPE_PERFORMANCE: _type = "Performance"; break;
case GL_DEBUG_TYPE_MARKER: _type = "Marker"; break;
case GL_DEBUG_TYPE_PUSH_GROUP: _type = "PushGrp"; break;
case GL_DEBUG_TYPE_POP_GROUP: _type = "PopGrp"; break;
case GL_DEBUG_TYPE_OTHER: _type = "Other"; break;
}
const char *_severity = "Unknown";
switch (severity) {
case GL_DEBUG_SEVERITY_HIGH: _severity = "High"; break;
case GL_DEBUG_SEVERITY_MEDIUM: _severity = "Med"; break;
case GL_DEBUG_SEVERITY_LOW: _severity = "Low"; break;
case GL_DEBUG_SEVERITY_NOTIFICATION: _severity = "Notify"; break;
}
#pragma GCC diagnostic warning "-Wswitch"
cerr << _source << "." << _type << "[" << _severity << "](" <<
id << "): " << message << endl;
}, nullptr);
glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE);
glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 0,
GL_DEBUG_SEVERITY_NOTIFICATION, -1, "Start debugging");