2012-02-23 91 views
1

没有进入太多的细节(我在这里寻找调试技术),我想了解如何更好地调试Xlib失败的请求。特别是处理glx扩展。我正在争取的错误发生在我的应用程序中的一个复杂的地方,试图将它拉开以提供一个小样本是不可能的。了解Xlib失败的请求

随着中说失败请求,我看到的是

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

线索在哪里看是在扩展名和请求本身的名称。不幸的是,在这种情况下,因为您使用了Xgl,这并没有那么有用。但是你可以通过检查glproto这样的协议文档来检查请求的真实性。从中你可以看到请求确​​实是glxMakeCurrent。那么你只需要找到该请求的文档或代码。

GLX规范说glxMakeCurrent将给BadAccess如果“上下文是其他线程当前”。

现在,你的错误是关于XGLMakeCurrent这是Xgl实现细节。但是通过阅读这个函数的实现,它会传递给底层的GLX实现。

解决您的问题,我建议你试试,如果是在另一个线程正在使用的上下文识别。

1

对于调试要打开同步请求,这会减慢你的代码,但会尽最大X请求等待,直到服务器继续之前对其进行处理,并立即返回一个错误。你可以用

XSynchronize(display, True); 

打开它现在,您将获得在引起问题的常规的X错误,可以使用标准的调试工具在那里。