2013-09-27 99 views
3

我做了一個簡單的OpenGL應用程序(link)。在那裏,你可以看到它應該是怎樣看的圖像 - 以及它是如何看我的電腦(OSX)上:你如何處理調試不能重現的東西?

correct

問題是:當我的客戶克隆和編譯它自己的電腦上(Ubuntu的),這是他看到的是:

wrong http://dl.dropboxusercontent.com/u/62862049/Screenshots/wl.png

我跟真的不解。如果我能夠重現錯誤,這將不成問題,但無法做到這一點,讓我無法知道如何開始修復它。我該如何處理這個問題?

+0

您確定您的客戶機上安裝了最新的圖形驅動程序嗎?另外,他有沒有使用過時的編譯器? –

+0

我不太確定,但它應該在那裏工作。你的意思是也許我打電話給一些新的功能?但是,那我怎麼猜? – MaiaVictor

+0

發表了一個答案 - 不能真正想到一個更簡單的方法來處理這個問題。 –

回答

1

我冒昧地糾正了我所看到的一個巨大的障礙,讓這段代碼的行爲可預見。 gluPerspective (...)應該用於設置投影矩陣,有時可以將每個方向都填充到一個矩陣中,但這並沒有多大意義。

void GLWidget::paintGL(){ 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

    /* Original code that does really bad things ... 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluPerspective(60.0f,(GLfloat)width/(GLfloat)height,0.01f,650.0f); 
    */ 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(60.0f,(GLfloat)width/(GLfloat)height,0.01f,650.0f); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(0.0, cam_radius, cam_radius, 
      0.0, 0.0, 0.0, 
      0.0, 0.0, 1.0); 
    glViewport(0, 0, width, height); 
    glRotatef(rotate_x, 1.0, 0.0, 0.0); 
    glRotatef(rotate_y, 0.0, 0.0, 1.0); 

    ... 

} 

至於調試東西,你不能重現,第一步是考慮每一個國家(或多個)可能產生一個類似於你(或者更確切地說,是別人)經歷的影響。這是我在StackOverflow上大部分時間執行的操作,當有人提供隨機代碼和屏幕截圖時。通常他們最初提供的代碼是無益的,但是問題的屏幕截圖和描述導致了正確的解決方案;幸運的是評論部分允許我們在提交答案之前要求更具體的代碼。

我聽到你的問題時首先想到的是投影和視口映射,這導致我在qglwidget.cpp的地方發現了一些頑皮的代碼。它可能不一定是你的整個問題,但它肯定是有問題,它符合所有的標準。

+0

哦,非常有趣。我完全錯過了。我沒有要求這一點,但是在你採取這一舉措後不能接受這個答案。謝謝。 – MaiaVictor

5

我該如何解決這個問題?

我建議使用VirtualBox在您的機器上創建一個虛擬的Ubuntu環境,以便您可以自己編譯和調試問題。

如果它在虛擬機上按照預期運行,那麼問題是可能是與您的客戶端驅動程序有關。

+0

當然,但如果我不能在那裏重現它(我認爲這可能是一個OpenGL問題)。 – MaiaVictor

+0

如果你不能在那裏重現它,我想這個問題是在你的客戶端。讓他得到最新的驅動程序或'apt-get dist-upgrade'。 –

+1

另外請注意,它可能相反是*你*已經過時的驅動程序,客戶看到的是正確的,並且你的代碼是錯誤的,但是因爲你用錯誤的驅動程序開發它似乎工作。或者這兩組驅動程序都是正確的並且是最新的,但是你的代碼意外地依賴於在OpenGL的不同實現之間實際可變的一些數量或行爲,因此原則上甚至可以在你的虛擬Ubuntu和你的客戶端Ubuntu之間變化(由於不同的硬件或什麼)。 –

1

如果您不想遵循this suggestion並使用virtualbox,則其他選項將獲得與您的客戶端(至少類似的硬件,以及相同的操作系統和安裝包)相同的設置。這樣可能更容易重現和調試。

有時,由於驅動程序問題,應用程序的行爲與不同的GPU不同。如果司機是最新的,這並不重要。

1

我曾經有過的一些奇怪的問題,例如源於未初始化的數據。 Valgrind是發現這些問題的天賜之物。 Valkyrie是一個很好的應用程序來組織它的輸出。

在這個特定的情況下,我會拋出瘋狂的猜測。當窗口管理器發送延遲調整大小事件或者沒有初始大小調整事件時,我已經看到過這種情況。例如,如果您的代碼希望在第一次繪製調用之前發送調整大小事件(或者當您存儲用於設置視口和縱橫比的初始窗口大小),並且該事件不會立即發生,那麼您的錯誤值。如果在進入主循環之前沒有發生真正的resize事件,我的GL框架會在內部注入一個resize事件(如果在終於出現時想要忽略真實的resize事件,那麼很麻煩)。

相關問題