Понимание неудачных запросов Xlib - PullRequest
1 голос
/ 23 февраля 2012

Не вдаваясь в подробности (я ищу способы отладки здесь), я хотел бы понять, как лучше отлаживать неудачные запросы Xlib.В частности, дело с расширением GLX.Возникновение ошибки, с которой я борюсь, находится в сложном месте в моем приложении, и попытка отделить его, чтобы предоставить небольшую выборку, здесь невозможна.

С учетом сказанного неудавшийся запрос, который я вижу,

x10:  fatal 10 error 11 (Resource temporarily unavailable) on X server ":0.0"
      after 46 requests (46 know processed) with 0 event remaining.
X Error of failed request: BadAccess (attempt to access private resource denied)
  Major opcode of failed request: 135 (GLX)
  Minor opcode of failed request: 5 (XGLMakeCurrent)
  Serial number of failed request: 46
  Current serial number in output stream: 46

Я вижу, где проблема вызвана переходом к отладчику.Однако я не могу полностью понять, почему это происходит.

Ответы [ 2 ]

2 голосов
/ 26 февраля 2012

Ключ к поиску находится в имени расширения и имени самого запроса.К сожалению, в этом случае из-за использования Xgl это не очень полезно.Но вы можете проверить, что на самом деле представляет собой запрос, проверив документацию протокола, подобную этой, для glproto .Отсюда видно, что запрос действительно glxMakeCurrent.Тогда вам просто нужно найти документацию или код для этого запроса.

В спецификации GLX сказано, что glxMakeCurrent даст BadAccess, если "контекст является текущим для какого-то другого потока".

Теперь ваша ошибка составляет около XGLMakeCurrent, что является подробностью реализации Xgl .Но после прочтения реализации этой функции она переходит к базовой реализации GLX.

Чтобы исправить вашу проблему, я предлагаю вам попытаться определить, используется ли этот контекст в другом потоке.

1 голос
/ 24 апреля 2014

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

XSynchronize(display, True);

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

...