Я использую ARB_DEBUG_OUTPUT
расширение для отлова ошибок OpenGL, но программа вылетает после вызова моей функции регистрации ошибок.
Я установил расширение, используя код из этот блог. Вот точный код, который я использую для настройки обратного вызова:
glDebugMessageCallback((GLDEBUGPROC)debugCallbackARB, stderr);
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
Вот debugCallbackARB
void debugCallbackARB(GLenum source, GLenum type, GLuint id, GLenum severity,
GLsizei length, const GLchar *message, GLvoid *userParam)
{
(void)length;
FILE *outFile = (FILE*)userParam;
char finalMessage[256];
formatDebugOutputARB(finalMessage, 256, source, type, id, severity, message);
logger->debug("%s", finalMessage);
}
я использую glEnable
с неверным параметром для запуска обратного вызова:
glEnable(GL_DEPTH);
После успешной печати сообщения об ошибке программа вызывает необработанное исключение Access violation executing location 0x00000500.
Я использую SDL2 для создания контекста отладки профилей ядра OpenGL 3.3 и GL Load чтобы получить указатели расширения GL.
Программа не падает на инвалида glEnable
позвоните, если я отключу добавочный номер.
Как я могу это исправить?
Спецификации компьютера:
Редактировать: Я также попытался вызвать обратный вызов отладки вручную, но он не вызывает исключение.
Функции обратного вызова OpenGL используют __stdcall
соглашение о созыве вместо __cdecl
это включено по умолчанию в MSVC2012.
Я изменил определение обратного вызова на
void CALLBACK debugCallbackARB(GLenum source, GLenum type, GLuint id, GLenum severity,
GLsizei length, const GLchar *message, GLvoid *userParam)
с использованием CALLBACK
макрос, определяемый заголовками Windows API.
Неверный адрес 0x00000500
равно 1280 в десятичном виде, и это, как оказалось, параметр ширины экрана, передаваемый в функцию инициализации на один шаг выше в иерархии вызовов. Из-за недопустимого соглашения о вызовах это значение было прочитано из стека вместо фактического адреса возврата, установленного графическим драйвером, вызывающим функцию.
Других решений пока нет …