[英]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];
}
}
讓我感到非常沮喪的是,模擬器上的所有功能都正常運行。 另外,我非常有信心這個確切的代碼實際上早幾個小時就可以在設備上運行了……也許我發瘋了!
我沒有運氣就嘗試了以下方法:
這真的讓我感到困惑。 最令人討厭的是為什么在模擬器中一切正常。 對此,我將不勝感激!
編輯
這是錯誤的回溯:
#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.