C ++:分段错误在printf中间,但仅限于Ubuntu

时间:2014-09-05 18:47:00

标签: c++ opengl ubuntu printf

我正在Ubuntu和Windows上编写一个小型OpenGL程序。在Windows上它运行得很好,但是在Ubuntu上我得到了#34;分段错误(核心转储)"在执行期间的不同时间。

为了缩小范围,我用printf()来填充主循环以告诉我崩溃的时间。但这是最奇怪的事情;当它崩溃时,它经常位于printf的中间。例如,如果我正在打印" Draw"它经常打印" Dr"就在崩溃之前。

我没有任何多线程。我没有将任何变量传递给printf; just printf(" Draw"),printf(" Step")等。

我能想到的唯一方法是,如果GPU上的着色器崩溃,使崩溃与CPU活动异步。所以我删除了我的着色器(使用标准管道),但仍然出现错误。 :(

有什么想法可能会发生什么?

编辑:抱歉我花了一段时间才找回家伙,我一直忙于上学。

我找到了错误 - 我使用的模数函数定义为:

int modulus(int x,int m) {return x - m * std :: floor((float)x /(float)m);}

显然浮点精度不足以处理rand()的输出,导致此函数输出不可能(负)值。但改变我的类型转换为双重解决问题。我觉得崩溃与我的代码不同步似乎仍然很奇怪,但我想这肯定是SDL在引擎盖下使用多线程的结果。

1 个答案:

答案 0 :(得分:0)

OpenGL实现通常在单独的线程上完成大部分工作。您可能已将错误数据传递给OpenGL,并且工作线程此时正在访问它。活动线程的回溯应该清楚这是否正确。