2014-09-05 63 views
-1

我正在Ubuntu和Windows上編寫一個小型的OpenGL程序。在Windows上它可以很好地工作,但在Ubuntu上,我會在執行期間的不同時間收到「分段錯誤(核心轉儲)」。爲了縮小它的範圍,我用printf()的主循環填充來告訴我它何時崩潰。但這是最奇怪的事情;當它崩潰時,它通常在printf的中間。例如,如果我正在打印「繪圖」,它通常會在撞擊前打印「Dr」。C++:在printf中間出現分段錯誤,但只在Ubuntu上

我沒有任何多線程。我沒有將任何變量傳遞給printf;只是printf(「繪製」),printf(「步驟」)等

我想這可能是唯一的辦法,如果我的着色器在GPU上崩潰,使與CPU異步崩潰活動。所以我刪除了我的着色器(使用標準管道),錯誤仍然發生。 ?:(

任何想法可能會在

編輯該走:對不起,我花了一段時間來找回傢伙,我一直忙於學業

我所在的錯誤 - 我是使用被定義爲一個模函數:

INT模量(INT X,INT米) {返回X - M * STD ::地板((浮點)的x /(浮點)米);}

顯然, float的精度不足以處理rand()的輸出,導致這個函數t o輸出不可能的(負數)值。但將我的類型轉換爲雙重解決了這個問題。對我來說,這似乎很奇怪,崩潰與我的代碼不同步,但我想這一定是SDL在底層使用多線程的結果。

+1

發佈SSCCE和回溯。可能是你的'GL_VENDOR','GL_RENDERER'和'GL_VERSION'字符串。 – genpfault 2014-09-05 18:51:31

+0

當發生這種情況時,通常你會走出數組的界限 – braindf 2014-09-05 18:52:16

+0

你在行42中有未定義的行爲。 – 2014-09-05 18:58:28

回答

0

OpenGL實現通常在單獨的線程上完成大部分工作。很可能您已將錯誤的數據傳遞給OpenGL,並且工作線程在那時訪問它。活動線程的回溯應該明確這是否爲真。

+0

這就是答案,顯然SDL必須在引擎蓋下使用多線程。我編輯了我的問題以包含解決方案。 – user258887 2014-09-13 20:32:07