LINUX.ORG.RU

Окно, созданное с помощью GLUT, сразу же вылетает

 , ,


0

1

Всем доброго времени суток!

Пишу на C++ программу для работы с графами. Решил вводить граф следующим образом - сперва появляется небольшое окошко, в которое пользователь вводит количество вершин графа, затем появляется большое окно, где пользователь задаёт рёбра графа, соединяя вершины между собой. При этом графы - это класс, а функции ввода и обработки графов - методы этого класса (GLUTовские функции вывода на экран, работы с мышью и клавиатурой - тоже методы, только статические). Для реализации решил использовать библиотеку GLUT (вернее, freeGLUT, так как просто GLUT не умеет в закрытие окна без закрытия программы). Первый граф вводится без каких-либо проблем, но нужно ввести два. А при попытке ввести второй граф:

Либо нормально работает только первое окно, а второе сразу вылетает, либо вылетает сразу первое, с сообщением

X Error of failed request: BadRequest (invalid request code or no such operation)

Major opcode of failed request: 0 ()

Serial number of failed request: 70

Current serial number in output stream: 71

Иногда оба графа вводятся нормально, но это очень редко, чаще всего ввести удаётся только первый граф. В чём может быть причина этого?



Последнее исправление: Reymet_2 (всего исправлений: 1)

Лично я подозреваю что где-то в твоём коде как-то память бьётся так, что какие-то иксовые структуры ломаются.

Ещё это может связано с тем, что GLUT и все его форки это либа по сути больше учебная и для реальных проектов её обычно не используют, предпочитая SDL, GLFW, GLFM, ImGUI и подобные. Посему код в GLUT может быть тупо сломан и всем на это будет пофиг.

ИМХО, имеет смысл освоить более используемый в реальных проектах фреймворк. Особенно раз у тебя многооконное приложение.

Дистрибутив кстати какой? Под Wayland (XWayland) баг этот проверял?

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 2)
Ответ на: комментарий от EXL

//Лично я подозреваю что где-то в твоём коде как-то память бьётся так, что какие-то иксовые структуры ломаются. Возможно. Вообще, помимо описанной в первом посте он ещё может выдавать ошибку BadLength (poly request too large of internal Xlib length error). Иногда, если второй граф ввести тоже удалось, может вывести ошибку freeglut: illegal glutinit() reinitialization attempt. Хотя уже при ввод первого графа glutinit() вызывается два раза, и при вводе первого графа он почему-то не выделывается.

Динамическая память у меня действительно много где используется (в графе есть один двумерный массив int (int **a), два одномерных массива целых чисел (int *a), одномерный массив символов (char *a). Также в классе есть статический одномерный массив (static int *a), и в функции обработки графа есть двумерный массив. Но проблемы возникают как правило уже на этапе ввода второго графа. То есть первый вводится нормально, а при попытке ввести второй, с абсолютно аналогичными операциями с памятью (выделение под массивы) - почему-то вылетает. Причём то вылетает, то нет.

Попробую посмотреть в xorg.0.log, может там что интересное есть //Дистрибутив кстати какой? Gentoo

//Под Wayland (XWayland) баг этот проверял? Не проверял, он у меня и не стоит вроде как

Reymet_2
() автор топика
Ответ на: комментарий от Reymet_2

Попробую посмотреть в xorg.0.log, может там что интересное есть

Сомневаюсь. Я бы начал с выделения проблемы в «минимально нерабочий пример», чтобы отмести другие различные предположения, к примеру, что GLUT глючит с двумя окнами, а не графы. Потом я бы прогнал приложение под Valgrind’ом и GDB, потыкал кодовую базу статическими анализаторами.

Проблему сперва нужно локализовать и точно выделить место в коде из-за которой она возникает – лучший способ обнаружить причину – это как раз «форкнуть» проект и отсекать от него куски, компилируя и проверяя её наличие.

Но сперва скомпилируй всё с отладочными символами и запустись под GDB.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

//что GLUT глючит с двумя окнами

Вот я попробовал убрать всё, кроме собственно окон, и оказалось, что так и есть. Причём первые два окна выводит нормально, а третье почему-то вылетает.

Кстати, в качестве major opcode of failed request постоянно выскакивают самые разные варианты: 32 (X_Ungrab_Keyboard), 99 (X_ListExtensions), 47 (X_QueryFont) и т. д.

Я какое-то время думал, что это из-за того, что третье окно вызывает те же функции glutDisplayFunc, glutKeyboradFunc и glutMouseFunc, что и первое (так как графы вводятся при помощи метода класса), но сейчас поставил на все четыре окна разыне функции glutDisplayFunc - и всё равно первые два окна проходит нормально, а на третьем почему-то всё застревает

Reymet_2
() автор топика
Ответ на: комментарий от Reymet_2

Возможно что проблема именно с GLUT’ом, он тупо древний и хреновоподдерживаемый. Мне кажется для окошек лучше взять какой-нибудь SDL2 или вообще Qt.

EXL ★★★★★
()
Ответ на: комментарий от EXL

Ничего не изменилось.

// Возможно что проблема именно с GLUT’ом, он тупо древний и хреновоподдерживаемый.

Вроде же FreeGLUT, в отличие от GLUTа оригинального, поддерживается…

Reymet_2
() автор топика

В чём может быть причина этого?

У библиотеки libX11, через которую происходит общение с иксами, есть особенность — все ошибки фатальные. Их можно спрятать, переопределив функцию обработки ошибок через XSetErrorHandler(). Это не исправит причину появления ошибок, но отложит завершение программы.

В чём причина, по которой ошибки возникают, сложно сказать. Могу только порекомендовать вставить в код freeglut вызов XSynchronize(), чтобы запрос и пришедший ответ с ошибкой были как можно ближе по времени. Тогда есть шанс поймать момент в gdb, а там уже разобраться, почему возникает BadRequest.

i-rinat ★★★★★
()

GLUT_USE_CURRENT_CONTEXT задан для каждого окна? Все окна должны использовать один OpenGL контекст, и доступ к данным каждое окно должно иметь монопольное, если у тебя в одном окне массив алоцируется, затем в другом он рисуется, затем в первом ты реаллоцируешь его, пока отрисовывается во втором жди беды. Вот она у тебя скорее всего и есть. Первый граф данными забил и пустил на отрисовку, всё зыбыл про эти данные менять можно только значения, надо рисовать второе первое не трогай, нутыпонял. Вагную причина просто в битых данных, а в иксы через 33 колоды прилетает сообщение о NULL данных.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

//если у тебя в одном окне массив алоцируется, затем в другом он рисуется, затем в первом ты реаллоцируешь его, пока отрисовывается во втором жди беды

Окна открываются последовательно. Первое закрылось - второе открылось, второе закрылось - третье открылось, третье закрылось - четвёртое открылось. Т. е. в любой момент времени существует только одно окно.

+см. комментарий от 27.12.22 21:25:59 MSK. Запуск программы, только открывающей окна и не обрабатывающей каких-либо массивов, привёл к аналогичному результату.

Reymet_2
() автор топика
Ответ на: комментарий от i-rinat

Запустил внутри xtrace… Всё работает идеально. Кстати, после презагрузки иксов какое-то время тоже всё работало идеально, а потом снова начал вылетать.

Xtrace вроде как виртуальную сессию иксов создаёт. Короче, проблема скорее всего в иксах, а не в глуте

Reymet_2
() автор топика
Ответ на: комментарий от Reymet_2

Короче, проблема скорее всего в иксах, а не в глуте

проблема абсолютно точно в вашем коде.

Разместите его где-нибудь (на git или pastebin на худой конец), опубликуйте ссылку и вам возможно помогут.

PS/ детский сад, «моя первая наколенная нетленка валится со страшной силой, но виноват конечно X или GL, а возможно вообще linux».

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Разместите его где-нибудь (на git или pastebin на худой конец), опубликуйте ссылку и вам возможно помогут.

Ну, собственно, вот

https://pastebin.com/QdN397Qk

Из-под sudo работает идеально, а из-под обычного пользователя вылетает на третьем окне.

моя первая наколенная нетленка валится со страшной силой

Ну вообще, я уже довольно приличное количество раз работал с GLUTом, и такого безобразия не было.

а возможно вообще linux

Хммм… а неплохая идея, попробую запустить под виндой и посмотреть, что будет

Reymet_2
() автор топика
Ответ на: комментарий от Reymet_2

Короче, проблема скорее всего в иксах, а не в глуте

А ты посмотри, будет ли оно работать под XWayland на Wayland-сеансе. X.Org ведь deprecated и его скоро выкинут и подобные баги там не фиксят годами.

EXL ★★★★★
()