Нарушение прав доступа с помощью ARB_DEBUG_OUTPUT

Я использую 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 позвоните, если я отключу добавочный номер.

Как я могу это исправить?

Спецификации компьютера:

  • NVIDIA GeForce GT 630
  • ForceWare 327.23
  • Windows 7 x64

Редактировать: Я также попытался вызвать обратный вызов отладки вручную, но он не вызывает исключение.

3

Решение

Функции обратного вызова 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 в десятичном виде, и это, как оказалось, параметр ширины экрана, передаваемый в функцию инициализации на один шаг выше в иерархии вызовов. Из-за недопустимого соглашения о вызовах это значение было прочитано из стека вместо фактического адреса возврата, установленного графическим драйвером, вызывающим функцию.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]