繁体   English   中英

设备上令人沮丧的EXC_BAD_ACCESS(与NSData / OpenGL有关?)-在模拟器上工作正常

[英]Frustrating EXC_BAD_ACCESS (NSData / OpenGL related?) on device - works fine on simulator

这使我发疯。 我最近介绍了一些代码,这些代码将来自OpenGL视图的图像数据存储在NSData对象中,并将其存储在Core Data中。 检索此图像并尝试将此像素数据绘制回纹理时,我收到了EXC_BAD_ACCESS错误。

这是导致该错误的代码:

- (void)drawDrawingFromData:(NSData *)data {

    if (data != nil) {
        [renderer prepareRetainedBuffer];

        /* Prepare data in raw bytes */
        NSInteger width = self.bounds.size.width, height = self.bounds.size.height;
        NSUInteger dataLength = width * height * 4;
        unsigned char pixelData[dataLength];
        [data getBytes:pixelData length:dataLength];               // <---- EXC_BAD_ACCESS here.

        /* Create a texture to render using pixel data */
        GLuint imageTexture;
        glGenTextures(1, &imageTexture);                           // <---- EXC_BAD_ACCESS occurs here if the [data getBytes:length:] line is commented out.
        glBindTexture(GL_TEXTURE_2D, imageTexture);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);


        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);

        // Destination coords.
        GLfloat retainedVertices[] = {
            0.0,    0.0,
            width,  0.0,
            0.0,    height,
            width,  height,
        };

        // Source coords.
        GLfloat retainedTexCoords[] = {
            0.0, 1.0,
            1.0, 1.0,
            0.0, 0.0,
            1.0, 0.0
        };

        glColor4f(1.0, 1.0, 1.0, 1.0);
        glBindTexture(GL_TEXTURE_2D, imageTexture);
        glVertexPointer(2, GL_FLOAT, 0, retainedVertices);
        glTexCoordPointer(2, GL_FLOAT, 0, retainedTexCoords);
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

        glDisableClientState(GL_VERTEX_ARRAY);
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);


        [renderer renderSceneWithScratch:NO];
        [renderer presentScene];
    }
}

让我感到非常沮丧的是,模拟器上的所有功能都正常运行。 另外,我非常有信心这个确切的代码实际上早几个小时就可以在设备上运行了……也许我发疯了!

我没有运气就尝试了以下方法:

  • 检查pixelData数组是否足够大以存储NSData对象中的所有字节。
  • 重新启动设备,重新启动Xcode(顺便说一下版本4),完成一个干净的构建,清除Core Data模型并重新构建它。
  • 确保在调用NSData对象时正确保留了该对象。
  • 逐渐注释掉
    码。 对于我注释掉的每一行,
    EXC_BAD_ACCESS错误移动
    再向下。 这是否表示该错误可能是由于
    从另一个回来的东西
    线?

这真的让我感到困惑。 最令人讨厌的是为什么在模拟器中一切正常。 对此,我将不胜感激!

编辑

这是错误的回溯:

#0  0x36cc6c92 in objc_msgSend ()
#1  0x0001e71c in -[EAGLView drawDrawingFromData:] (self=0x14dbf0, _cmd=0x4e16f, data=0x13dbd0) at /Users/Stu/Documents/...
#2  0x0001df30 in -[EAGLView layoutSubviews] (self=0x14dbf0, _cmd=0x329644ac) at /Users/Stu/Documents/...
#3  0x326675fa in -[UIView(CALayerDelegate) layoutSublayersOfLayer:] ()
#4  0x35ee2f02 in -[NSObject(NSObject) performSelector:withObject:] ()
#5  0x333e2bb4 in -[CALayer layoutSublayers] ()
#6  0x333e296c in CALayerLayoutIfNeeded ()
#7  0x333e81c4 in CA::Context::commit_transaction ()
#8  0x333e7fd6 in CA::Transaction::commit ()
#9  0x333e1054 in CA::Transaction::observer_callback ()
#10 0x35f4ca34 in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ ()
#11 0x35f4e464 in __CFRunLoopDoObservers ()
#12 0x35f4f75a in __CFRunLoopRun ()
#13 0x35edfec2 in CFRunLoopRunSpecific ()
#14 0x35edfdca in CFRunLoopRunInMode ()
#15 0x3253c41e in GSEventRunModal ()
#16 0x3253c4ca in GSEventRun ()
#17 0x32690d68 in -[UIApplication _run] ()
#18 0x3268e806 in UIApplicationMain ()
#19 0x000023a0 in main (argc=1, argv=0x2fdff540) at /Users/Stu/Documents/...

谢谢

您在堆栈上分配pixelData 您可能溢出了设备的堆栈,该堆栈可能比模拟器允许的堆栈小。 我建议改为使用new在堆上分配它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM