2011-06-12 4 views
1

C++에서 Android를 실행하는 휴대 전화, webOS를 실행하는 휴대 전화 및 SDL/OpenGL을 사용하는 Mac에서 실행되는 간단한 OpenGL ES 코드가 있습니다. 문제의 코드는 GLfloat의 배열에 저장된 GL_LINE_STRIP을 그립니다. 꽤 간단합니다 같은glDrawArrays() 너무 많은 요소를 그릴 때 segfaults가 발생했습니다.

GLfloat array* = new GLfloat[2048]; 
//later... (array gets filled) 
int howMany = 1024; 
glVertexPointer(2, GL_FLOAT, 0, array); checkError(); 
glDrawArrays(GL_LINE_STRIP, 0, howMany); checkError(); 

이 보인다 : 여기 내가이 (버전 1을) 할 노력하고있어 방법입니다. 그러나, 안드로이드와 내 Mac에서 모두 OpenGL 드라이버 내부의 위의 코드 세그먼테이션 폴트 (segfault)은 (어떤 이유로, 웹 OS에 잘 실행하는 것 같다.) 여기이 (버전 2) 피하기 위해해야 ​​할 작업은 다음과 같습니다

GLfloat array* = new GLfloat[2048]; 
//later... (array gets filled) 
int howMany = 1024; 
for (unsigned i = 0; i < howMany; i += 789) { 
    glVertexPointer(2, GL_FLOAT, 0, array+i*2); checkError(); 
    //this is not a bug: we draw one more than we increment by, or there is a hole in the graph 
    glDrawArrays(GL_LINE_STRIP, 0, std::min(790U, howMany-i)); checkError(); 
} 

한 번에 그려지는 선의 수를 제한하면 segfault가 발생하지 않습니다. 번호 790은 실험적으로 결정되었습니다. 791에서는 OSX에서 충돌이 발생합니다 (안드로이드는 이전 버전보다 113 버전으로 제한되었지만 더 높아질 수 있습니다 ... 따라서 각 버전의 앱 버전은 동일하지만 다른 버전이나 플랫폼 간에는 일치하지 않습니다)

내 응용 프로그램에서 계속 진행중인 다른 GL 작업이 많이 있지만 큰 응용 프로그램이며 해당 코드를 모두 게시하면 실용적이지 않습니다. 그래서, 무엇이 이것을 일으킬 수 있습니까? 무엇을 조사해야합니까? 여기

내 프로그램 실행의 Valgrind의 출력이고 나는 버전 1을 사용하려고 할 때 OSX에 충돌 : 처음 두 조건 점프 오류가 때마다 일어날 것을

==85414== Conditional jump or move depends on uninitialised value(s) 
==85414== at 0x1D022993: glVertexPointer_Exec (in /System/Library/Frameworks/OpenGL.framework/Versions/A/Resources/GLEngine.bundle/GLEngine) 
==85414== by 0x6AA59A9: glVertexPointer (in /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib) 
==85414== by 0x2B001: draw_elements (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x2B44C: glDrawArrays (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0xB639: GLImage::glDraw(int, int) (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0xC292: GLLabel::glDraw(int, int) (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x1AC67: RTAPlot::drawAxes(int) (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x1B30A: RTAPlot::updateGL() (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x225F5: RTAPlotView::updateForeground() (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x19FC4: RTAComponent::update() (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x805D: AudiaApplication_private::updateGL() (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x267DF: AudiaApplication::run() (in ./rta.app/Contents/MacOS/rta) 
==85414== Uninitialised value was created by a stack allocation 
==85414== at 0x1D02268F: glVertexPointer_Exec (in /System/Library/Frameworks/OpenGL.framework/Versions/A/Resources/GLEngine.bundle/GLEngine) 
==85414== 
==85414== Conditional jump or move depends on uninitialised value(s) 
==85414== at 0x1D022E0C: glTexCoordPointer_Exec (in /System/Library/Frameworks/OpenGL.framework/Versions/A/Resources/GLEngine.bundle/GLEngine) 
==85414== by 0x6AA5216: glTexCoordPointer (in /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib) 
==85414== by 0x2B279: draw_elements (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x2B44C: glDrawArrays (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0xB639: GLImage::glDraw(int, int) (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0xC292: GLLabel::glDraw(int, int) (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x1AC67: RTAPlot::drawAxes(int) (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x1B30A: RTAPlot::updateGL() (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x225F5: RTAPlotView::updateForeground() (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x19FC4: RTAComponent::update() (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x805D: AudiaApplication_private::updateGL() (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x267DF: AudiaApplication::run() (in ./rta.app/Contents/MacOS/rta) 
==85414== Uninitialised value was created by a stack allocation 
==85414== at 0x1D022A6B: glTexCoordPointer_Exec (in /System/Library/Frameworks/OpenGL.framework/Versions/A/Resources/GLEngine.bundle/GLEngine) 
==85414== 
==85414== Invalid read of size 8 
==85414== at 0x1D0B9166: gleRunVertexSubmitImmediate (in /System/Library/Frameworks/OpenGL.framework/Versions/A/Resources/GLEngine.bundle/GLEngine) 
==85414== by 0x1D0B84FB: gleLLVMArrayFunc (in /System/Library/Frameworks/OpenGL.framework/Versions/A/Resources/GLEngine.bundle/GLEngine) 
==85414== by 0x1D0A14F2: gleDrawArraysOrElements_ExecCore (in /System/Library/Frameworks/OpenGL.framework/Versions/A/Resources/GLEngine.bundle/GLEngine) 
==85414== by 0x1D0A2A04: glDrawElements_IMM_Exec (in /System/Library/Frameworks/OpenGL.framework/Versions/A/Resources/GLEngine.bundle/GLEngine) 
==85414== by 0x6AA304F: glDrawElements (in /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib) 
==85414== by 0x2B2DB: draw_elements (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x2B44C: glDrawArrays (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x1FEF6: RTAPlotCanvas::drawLineStrip(float*, unsigned int) (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x1E91A: RTAPlotCanvas::updateGL() (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x1B318: RTAPlot::updateGL() (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x225F5: RTAPlotView::updateForeground() (in ./rta.app/Contents/MacOS/rta) 
==85414== by 0x19FC4: RTAComponent::update() (in ./rta.app/Contents/MacOS/rta) 
==85414== Address 0xc0000000 is not stack'd, malloc'd or (recently) free'd 
==85414== 
==85414== 
==85414== Process terminating with default action of signal 11 (SIGSEGV) 
==85414== General Protection Fault 
==85414== at 0x10AED0: misaligned_stack_error_ (in /usr/lib/libSystem.B.dylib) 
==85414== by 0x1E45E87: -[NSCustomReleaseData dealloc] (in /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit) 
==85414== by 0x1E45E37: -[NSBitmapImageRep _freeData] (in /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit) 
==85414== by 0x1E45DCA: -[NSBitmapImageRep _freeImage] (in /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit) 
==85414== by 0x1E45D74: -[NSBitmapImageRep dealloc] (in /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit) 
==85414== by 0x171DF37: CFRelease (in /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation) 
==85414== by 0x1748691: __CFArrayReleaseValues (in /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation) 
==85414== by 0x171E100: _CFRelease (in /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation) 
==85414== by 0x1D89F7A: -[NSImage dealloc] (in /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit) 
==85414== by 0x20857D4: -[NSCursor dealloc] (in /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit) 
==85414== by 0xDFE33: QZ_FreeWMCursor (in /opt/PalmPDK/host/lib/libSDL-1.2.0.11.2.dylib) 
==85414== by 0xCA11F: SDL_FreeCursor (in /opt/PalmPDK/host/lib/libSDL-1.2.0.11.2.dylib) 
--85414:0:schedule VG_(sema_down): read returned -4 

참고하고, 문제되지 않을 수도 있습니다 내 애플 리케이션. 잘못된 읽기 오류는 OSX에서 버전 1을 사용하려고 할 때만 발생합니다.

답변

7

꼭지점 배열과 관련이 없을 수도 있습니다. 예를 들어 다른 버텍스 애트리뷰트 세트에 대한 포인터가 여전히있을 수 있습니다. 물론 새로운 버텍스 배열보다 작은 버퍼 인 경우 세그 폴트가 생깁니다.

valgrind 출력을 자세히 살펴보면 여전히 텍스처 좌표 포인터가 설정되어 있습니다.

그래서 내가 제안 당신이 모든 정점 속성 필요하지 않은 배열 비활성화입니다 : 귀하의 경우 물론

glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
+0

glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_COLOR_ARRAY); /* ... */ 

를, 지금은 분명한 것 같다. 그랬어! 'GL_TEXTURE_COORD_ARRAY'는 실제로 범인이었습니다. 나는이 사람이 나를 너무 오랫동안 저주했다는 것을 믿을 수 없다. :) 고마워. – tmandry

+0

"프로그램을 작동하게하는"숫자를 "측정"하기 시작하면 이것이 항상 단서가되며 근본적인 방법으로 문제가 발생합니다. 물론 프로그램이 실제 세계와 상호 작용하는 경우 측정에 관한 것입니다. 그러나 메모리 접근 패턴이 매직 넘버에 의존한다면 코드를 엉망으로 만들지 말고 실제로 무엇이 진행되고 있는지 생각할 시간입니다. 귀하의 경우에는 포인터가없는 언어로 깨질 수있는 무언가를 발견했습니다. 예를 들어 파이썬 OpenGL 바인딩은 이런 종류의 버그에도 취약하며 같은 방식으로 충돌합니다. – datenwolf

관련 문제