没有太多细节(我在这里寻找调试技术),我想了解如何更好地调试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
我可以通过调试器来查看问题所在。但是,我无法完全辨别出它为什么会发生。
答案 0 :(得分:2)
线索的位置在扩展名和请求本身的名称中。不幸的是,在这种情况下,由于您使用了Xgl,这不太有用。但您可以通过查看glproto这样的协议文档来检查请求的真实情况。从那里你可以看到请求真的是glxMakeCurrent
。然后,您只需找到该请求的文档或代码。
GLX规范说glxMakeCurrent
如果“上下文对某个其他线程是最新的”,则会给BadAccess
。
现在,您的错误大约是XGLMakeCurrent
,这是Xgl的实施细节。但是从阅读该函数的实现开始,它将传递给底层的GLX实现。
要解决您的问题,我建议您尝试确定该上下文是否正在另一个线程中使用。
答案 1 :(得分:1)
对于调试,您希望打开同步请求,这会降低您的代码速度,但会使每个X请求等到服务器处理它,然后再继续并立即返回错误。您可以使用
打开它XSynchronize(display, True);
现在您将在导致该问题的例程中获得X错误,并可以使用标准调试工具。