2012-02-23 59 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錯誤,可以使用標準的調試工具在那裏。