2012-09-03 32 views
2

設備:三星Galaxy Note Android版本:4.0.4致命信號11和無效的堆地址使用glShaderBinary

我的應用程序應用一些視覺效果使用OpenGL着色器的視頻流。出於安全原因,我需要使用二進制着色器。我使用glSurfaceViewSurfaceTexture訪問OpenGL着色器中的幀數據並使用擴展名GL_OES_EGL_image_external。就我使用着色器源而言,這工作正常。當我嘗試使用編譯的着色器二進制文件時,我經常會收到錯誤A/libc(4242): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1),程序崩潰。當工作時我嘗試關閉與返回鍵的應用程序,我通常會得到錯誤 A/libc(4907): @@@ ABORTING: INVALID HEAP ADDRESS IN dlfree

我試圖在Android的外部參照本地媒體示例應用程序來使用二進制着色器: http://androidxref.com/source/xref/development/ndk/platforms/android-14/samples/native-media/

和我得到相同的錯誤。

我創建使用ARM malisc 和我使用的加載二進制代碼提供的編譯的二進制着色器

private int ShaderFromBIN(Resources resource) { 

IntBuffer vert2 = IntBuffer.allocate(1); 
     IntBuffer frag2 = IntBuffer.allocate(1); 

     vert2.put(GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER)); 
     frag2.put(GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER)); 
     try { 
      InputStream in_sv = resource.openRawResource(R.raw.v2); 
      InputStream in_sf = resource.openRawResource(R.raw.f2); 

      byte[] bv = new byte [in_sv.available()]; 
      in_sv.read(bv); 
      //= IOUtils.toByteArray(in_sv); 
      ByteBuffer bbv = ByteBuffer.wrap(bv); 

      byte[] bf = new byte [in_sf.available()]; 
      //  IOUtils.toByteArray(in_sf); 
      in_sf.read(bf); 
      ByteBuffer bbf = ByteBuffer.wrap(bf); 

      IntBuffer numFormats = IntBuffer.allocate(1); 
      GLES20.glGetIntegerv(GLES20.GL_NUM_SHADER_BINARY_FORMATS, 
        numFormats); 
      IntBuffer formats; 
      if (numFormats.get(0) > 0) { 
       formats = IntBuffer.allocate(numFormats.get(0)); 
       GLES20.glGetIntegerv(GLES20.GL_SHADER_BINARY_FORMATS, formats); 

       for (int i = 0; i < numFormats.get(0); ++i) { 
        Log.d("format " + i + " ", formats.get(i) + ""); 

        GLES20.glShaderBinary(1, vert2, formats.get(i), bbv, bv.length); 
        GLES20.glShaderBinary(1, frag2, formats.get(i), bbf, bf.length); 
        checkGlError("compile vertex shader"); 
       } 

      } 
      in_sv.close(); 
      in_sf.close(); 
      bf = null; 
      bv = null; 

     } catch (Exception e) { 
      // e.printStackTrace(); 
      Log.e("Error: can't read resource.", ""); 
     } 

     sampler_program = GLES20.glCreateProgram(); 
     if (sampler_program != 0) { 
      GLES20.glAttachShader(sampler_program, vert2.get(0)); 
      checkGlError("glAttachShader"); 
      GLES20.glAttachShader(sampler_program, frag2.get(0)); 
      checkGlError("glAttachShader"); 
      GLES20.glLinkProgram(sampler_program); 
      checkGlError("glLinkProgram"); 
      int[] linkStatus = new int[1]; 
      GLES20.glGetProgramiv(sampler_program, GLES20.GL_LINK_STATUS, 
        linkStatus, 0); 
      if (linkStatus[0] != GLES20.GL_TRUE) { 
       Log.e(TAG, "Could not link program: "); 
       Log.e(TAG, GLES20.glGetProgramInfoLog(sampler_program)); 
       GLES20.glDeleteProgram(sampler_program); 
       sampler_program = 0; 
      } 
     } 
     checkGlError("after linking"); 
     if (sampler_program == 0) { 
      Log.e(TAG, "Error in creating and compiling the shader programs"); 
      return -1; 
     } 

     return sampler_program; 
    } 

我這個問題掙扎了4天。我做錯了什麼?請幫我解決這個問題。

謝謝

Dhammike

編輯:

當我崩潰日誌與NDK棧這就是我得到

*** 崩潰轉儲: ** *

Build fingerprint: 'samsung/GT-N7000/GT-N7000:4.0.4/IMM76D/XXLRK:user/release-keys' 
pid: 11581, tid: 11594 >>> com.example.nativemedia <<< 
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad 
Stack frame #00 pc 00017938 /system/lib/libc.so 
Stack frame #01 pc 000137c2 /system/lib/libc.so 
Stack frame #02 pc 00015b00 /system/lib/libc.so (dlfree) 
Stack frame #03 pc 00016178 /system/lib/libc.so (free) 
Stack frame #04 pc 00025e04 /system/lib/libMali.so (__mali_program_binary_state_reset) 
Stack frame #05 pc 00016068 /system/lib/egl/libGLESv2_mali.so(_gles_program_rendering_state_deref) 
Stack frame #06 pc 000281b4 /system/lib/egl/libGLESv2_mali.so_gles2_program_internal_free) 
Stack frame #07 pc 00028228 /system/lib/egl/libGLESv2_mali.so(_gles2_program_object_list_entry_delete) 
Stack frame #08 pc 0002da9c /system/lib/egl/libGLESv2_mali.so(_gles_share_lists_clear_v2_content) 
Stack frame #09 pc 000110d4 /system/lib/egl/libGLESv2_mali.so (_gles_share_lists_deref) 
Stack frame #10 pc 00026b88 /system/lib/egl/libGLESv2_mali.so (_gles2_delete_context) 
Stack frame #11 pc 00013efc /system/lib/egl/libEGL_mali.so (__egl_gles_release_context) 
Stack frame #12 pc 0000b07c /system/lib/egl/libEGL_mali.so (__egl_release_context) 
Stack frame #13 pc 0000b0d4 /system/lib/egl/libEGL_mali.so (_egl_destroy_context_internal) 
Stack frame #14 pc 0000b6e8 /system/lib/egl/libEGL_mali.so (_egl_destroy_context) 
Stack frame #15 pc 0000c720 /system/lib/egl/libEGL_mali.so (eglDestroyContext) 
Stack frame #16 pc 0000c346 /system/lib/libEGL.so (eglDestroyContext) 
Stack frame #17 pc 0004b67e /system/lib/libandroid_runtime.so 
Stack frame #18 pc 0001edb0 /system/lib/libdvm.so (dvmPlatformInvoke) 
Stack frame #19 pc 00059168 /system/lib/libdvm.so (_Z16dvmCallJNIMethodPKjP6JValuePK6MethodP6Thread) 
+0

經過一段時間的這個問題的掙扎後,我發現問題是與馬裏離線着色器編譯器。此問題在最新的離線着色器編譯器中排序。 – user665277

回答

2

我曾經在我的程序中發生過同樣的錯誤「ABORTING:INVALID HEAD ADDRESS in dlfree」。

這個問題沒有從信號拋出的地方。 相反,在我的代碼中完全無關的地方發生了內存損壞。

我花了一點時間弄清楚,但修復內存損壞解決了這個問題。嘗試禁用部分代碼並找到內存損壞。

希望這會有所幫助。

+0

感謝您的建議。我嘗試了這種方法,只要我註釋掉上面的ShaderFromBIN(Resources資源)方法,錯誤就會消失。無論如何,我會嘗試檢查是否有任何其他地方的內存損壞。 – user665277

相關問題