#c #debugging #opengl #codeblocks
#c #отладка #opengl #codeblocks
Вопрос:
Я уже несколько дней улучшаю собственный код OpenGL, и теперь я получил ужасный сюрприз: мой код работает правильно, если его запускать из IDE CodeBlocks (по меню-> Build -> Run), но если я открою его из проводника Windows, программа все равно будет открываться и выдавать сообщения на консоли, как если бы она работала правильно, но я просто получаю пустой экран.
Я пытаюсь перестроить код, чтобы увидеть, исчезла ли проблема из Windows, или посмотреть, влияет ли это также на запуск изнутри CodeBlocks, но результат все тот же.
Несколько дней назад (до того, как большая часть кода изменилась) я мог запускать программу как из Windows, так и из CodeBlocks и работать отлично в обоих случаях, так что это совершенно удивительно для меня сейчас.
Я использую GLFW3 и GLEW, и я ссылаюсь на следующие библиотеки:
- C:msys64mingw64liblibglew32.dll.a
- C:msys64mingw64liblibglfw3.a
- opengl32
- C:msys64mingw64liblibsfml-system.dll.a (Я использую часы этой библиотеки)
- gdi32
Тем временем я деинсталлировал и установил msys64, но это не повлияло на другие мои проекты OpenGL, связывающие одни и те же библиотеки, поэтому я полагаю, что это не источник проблемы
Как мне приступить к отладке такой проблемы? Я понятия не имею, как начать устранение неполадок, поэтому приветствуются любые комментарии о том, какую дополнительную информацию я должен опубликовать.
Обновление: если я открываю приложение из GPU PerfStudio и CodeXL, все работает просто отлично, но не при открытии через проводник Windows.
Комментарии:
1. Ну, вариантов не так уж много. Проверьте все еще раз. Может быть, вы забыли выйти с ошибкой, если ваша программа не может открыть какой-либо файл? Codeblocks хорошо известен тем, что устанавливает странный рабочий каталог для проектов. Если это не поможет, попробуйте постепенно сократить свой пример до hello world triangle, пока он не начнет работать. (Кроме того, просто говорю, что если бы вы использовали систему контроля версий, это было бы намного проще.)
2. Я всегда изменяю свой код так, чтобы либо он компилировался и выполнялся правильно, либо я отменяю все изменения, и это было удовлетворительно… до сих пор: ( К счастью, это частная вещь, поэтому ни одна компания не потеряет на этом деньги, но это все равно хороший урок!
3. У меня есть несколько вопросов, если можно: используете ли вы функции wgl (wglCreateContext, wglMakeCurrent и т. Д.) В своем проекте? Вы включили мультисэмплинг? Используете ли вы шейдеры? Вы проверяете наличие ошибок OpenGL?
4. Никакого WGL, никакого текстурирования. Ваш вопрос о шейдерах имеет интересный результат: я всегда проверяю ошибки компиляции шейдеров, и так же, как я тестирую, я временно ввел ошибку в шейдере (чтобы проверить, правильно ли моя программа ее прочитала), и моя программа выдала исключение, потому что шейдер не скомпилировался (я запрограммировал исключение на цель). Но теперь я меняю имя шейдерных файлов на то, что программа не должна распознавать, и никакой ошибки не было. Я также перешел на шейдерный контент, чтобы снова вводить глупые ошибки, и, как ни странно, ошибка не выдается!
5. Извините за последний запутанный комментарий. Вот обновление: нет WGL, нет мультисэмплинга. Я проверяю ошибки компиляции шейдеров, хотя я не проверяю, найден ли файл шейдера или нет. Но я знаю, что файл найден, потому что, если я введу искусственную ошибку в код шейдера, моя программа, как и ожидалось, выдает исключение, в котором говорится, что шейдер не скомпилировался должным образом (проверяется через glGetShaderiv(_shader, GL_COMPILE_STATUS, amp;status).). Если статус не равен 1, выдается исключение.
Ответ №1:
Как мне приступить к отладке такой проблемы?
Когда я сталкиваюсь с подобными ошибками, я использую инструмент под названием CodeXL. Вы можете скачать последнюю версию здесь. Он автоматически прерывается при любой ошибке OpenGL и показывает вам, какие из ваших вызовов функций OpenGL вызвали ее.
Он бесплатный и работает также с графическими процессорами, отличными от AMD.
Вам не потребуется много времени, чтобы научиться им пользоваться: вы просто создаете новый проект, указываете ему путь к папке вашего проекта и .exe и нажимаете выполнить. (убедитесь, что установлен флажок Debug-> Breakpoints->Break при ошибке OpenGL)
// Более того, он визуализирует ваши буферы, показывает ваши загруженные текстуры и т. Д.. Обязательно проверьте это, если вы планируете программировать больше Windows OpenGL в будущем.
Комментарии:
1. Моя программа также отлично работала в CodeXL и GPU PerfStudio, но при открытии из проводника Windows я снова получил пустой экран. Это так странно!
2. Когда вы запускаете EXE-файл из проводника Windows, находятся ли файлы шейдеров рядом с ним (в той же папке)?
3. Да, это так, но не библиотеки. Я не думаю, что библиотеки, находящиеся там или в другом каталоге, будут иметь какое-либо значение?
4. Ну, во время компоновки используются статические библиотеки (.lib), и если вам не хватает какой-либо необходимой динамической библиотеки (.dll), .exe даже не запустится. Так что нет, они не должны иметь никакого значения.