1

У меня возникла странная проблема при кодировании программы OpenGl с C++ в Visual Studio Express 2010.
Я использую: Windows 7 64bit, OpenGl 4.x
не Мой партнер использует: Windows XP 32bit, Visual Studio Express 2010, OpenGl 2.x
Ошибка при необработанном исключении первой случайности на Win7 64bit (без проблем на XP 32bit, Linux 64bit)

До сих пор мы просто нарисовали вершины для наших моделей и она отлично работает на обеих системах (я знаю, я знаю: устарели, но мы все еще новички). Теперь он включил lib для импорта 3d-сеток и создания анимации. Для него все отлично работает, но я получаю

Исключение из первого шанса в 0x0055f838 в Ant Simulation.exe: 0xC0000005: Место для обнаружения нарушения доступа 0x00bb0000.
Необработанное исключение в 0x0055f838 в Ant Simulation.exe: 0xC0000005: Место для обнаружения нарушения доступа 0x00bb0000.

С отладчиком я проследил проблему к линии

glDrawArrays (GL_QUADS, 0, n_data);

Я попытался установить код, но ничего не запускается. Как ни странно, вчера я мог пройти эту линию 2-3 раза с отладчиком, пока он не разбился, сегодня он падает напрямую. Вчера я проверил, что n_data одинаково каждый раз. Если я запускаю * .exe в Windows, он сбой (код ошибки ниже). Когда мой партнер отправляет мне свой * .exe, он обычно не работает, но один раз я мог бы начать его. Я воспроизвел ошибку в других окнах. Мы пробовали на Linux 64bit, и проблем нет. Я попытался запустить его в режиме совместимости, но проблема остается неизменной (все еще происходит сбой).

Я искал вокруг и нашел это:
https://blogs.msdn.com/b/debugger/archive/2010/05/12/visual-studio-debugger-fails-to-catch-unhandled-exception-for-a-windows-form-or-wpf-application.aspx?Redirected=true

Не уверен, что если я это правильно понял. Есть исключение, которое я не могу поймать, но которое убьет приложение, но почему у другой системы не проблема с этим исключением?

Я попытался решить его так, как описано в ссылке, но, похоже, в VS Express у меня нет меню, чтобы бросать исключения с первым шансом. Я постараюсь получить VS 2012, но, тем не менее, мне хотелось бы знать: это загадочная вещь Windows или может быть проблема с моим кодом, которая вызывает сбой (как это предлагается в одном из комментариев в ссылке)? Я также высоко ценю экспликации за то, что на самом деле происходит ...

Я получаю ошибку, когда я бегу * .exe:

Имя события проблемы: APPCRASH

Имя приложения: Ant Simulation.exe
Версия приложения: 0.0.0.0

Применение Отметка: 511d99a3

Fault Module Name: StackHash_0a9e

Версия модуля ошибки: 0.0.0.0
Fault Модуль Отметка: 00000000

Код исключения: c0000005

Exception Offset: 0037f278

OS Версия: 6.1.7601.2.1.0.256.48

Locale ID: 1031

Дополнительная информация 1: 0a9e

Дополнительная информация 2: 0a9e372d3b4ad19135b953a78882e789

Дополнительная информация 3: 0a9e

Дополнительная информация 4: 0a9e372d3b4ad19135b953a78882e789

ответ

4

А «первый шанс исключение» в Windows, не C++ исключение, это означает, что система выполнения обнаружила незаконное поведение вашей программы, такие как разыменования неверный указатель. Фактически, «Точка обнаружения нарушения доступа 0x00bb0000» предлагает очень многое, что это то, что происходит.

Выполнение разыменования недействительного указателя не обязательно вызывает одно и то же поведение в разных системах или даже на разных прогонах на одном компьютере: см. Вопросы, например C code crashes in Windows, but not in Linux, для получения дополнительной информации. В этом случае ошибка, по-видимому, происходит внутри реализации GL, но это, вероятно, связано с более ранним кодом приложения, дающим плохую информацию.

Убедитесь, что все разрешенные массивы вершин имеют не менее n_data элементов. (Будьте особенно осторожны, чтобы убедиться, что у них нет только n_data - 1 элементов, и что n_data имеет значение, которое вы ожидали.) Вы также должны проверить, что все указатели, которые вы ранее передали в функции GL, были действительны. Слишком много состояний GL, чтобы проверить это, но это было бы моим первым предположением.

+0

Спасибо за быстрый ответ. Я ищу его. Если я найду это, я дам отзывы. До сих пор, когда я загружаю только статическое изображение, оно работает, что является показателем правильности вашей догадки. – Andarin

+0

-1, если предположить, что это ошибка OpenGL, а не OP. Это похоже на явное переполнение кучи, и гораздо БОЛЕЕ, скорее всего, в коде OPs, чем в проверенных кодом и относительно стабильных библиотеках OpenGL. – SecurityMatt

+0

Я не говорю, что это ошибка OpenGL, и даже конкретная реализация GL. Это обычное явление для нарушения предварительных условий OpenGL (это ошибка приложения), что приводит к сбою в вызове OpenGL. Пропуск неверного указателя на функцию GL является наиболее очевидным способом достижения этого, но есть более тонкие. Я отредактирую ответ, чтобы сделать это более ясным. –

Смежные вопросы