了解Xlib失败的请求

时间:2012-02-23 04:57:30

标签: x11 xlib

没有太多细节(我在这里寻找调试技术),我想了解如何更好地调试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 个答案:

答案 0 :(得分:2)

线索的位置在扩展名和请求本身的名称中。不幸的是,在这种情况下,由于您使用了Xgl,这不太有用。但您可以通过查看glproto这样的协议文档来检查请求的真实情况。从那里你可以看到请求真的是glxMakeCurrent。然后,您只需找到该请求的文档或代码。

GLX规范说glxMakeCurrent如果“上下文对某个其他线程是最新的”,则会给BadAccess

现在,您的错误大约是XGLMakeCurrent,这是Xgl的实施细节。但是从阅读该函数的实现开始,它将传递给底层的GLX实现。

要解决您的问题,我建议您尝试确定该上下文是否正在另一个线程中使用。

答案 1 :(得分:1)

对于调试,您希望打开同步请求,这会降低您的代码速度,但会使每个X请求等到服务器处理它,然后再继续并立即返回错误。您可以使用

打开它
XSynchronize(display, True);

现在您将在导致该问题的例程中获得X错误,并可以使用标准调试工具。