致命的信号11并使用glShaderBinary当IN dlfree错误无效堆地址 [英] Fatal signal 11 and INVALID HEAP ADDRESS IN dlfree error when using glShaderBinary

查看:688
本文介绍了致命的信号11并使用glShaderBinary当IN dlfree错误无效堆地址的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

设备:三星Galaxy Note
Android版本:4.0.4

我的应用程序应用一些视觉效果使用OpenGL着色器的视频流。我需要使用二进制着色器出于安全原因。我使用 glSurfaceView 表面纹理来访问OpenGL的着色器的帧数据,并使用扩展 GL_OES_EGL_image_external 。这是罚款,据工作作为我使用的着色器源。当我尝试使用编译着色器的二进制文件,我经常得到一个错误 A / libc的(4242):在00000000致命信号11(SIGSEGV)(code = 1)和程序崩溃。当工作时我尝试关闭与返回键的应用程序通常我得到的错误
A / libc的(4907):@@@ ABORTING:无效堆地址在dlfree

我试图在Android的外部参照本地媒体示例应用程序来使用二进制着色器:
http://androidxref.com/source/xref/development/ndk/platforms/android-14/samples/native-media/

和我得到同样的错误。

我创建使用由ARM提供malisc编译二进制着色器
和code我使用加载二进制文件

 私人诠释ShaderFromBIN(资源的资源){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));
        尝试{
            InputStream的in_sv = resource.openRawResource(R.raw.v2);
            InputStream的in_sf = resource.openRawResource(R.raw.f2);            字节[] = BV新的字节[in_sv.available()];
            in_sv.read(BV);
            // = IOUtils.toByteArray(in_sv);
            ByteBuffer的BBV = ByteBuffer.wrap(BV);            字节[] BF =新的字节[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格式;
            如果(numFormats.get(0)大于0){
                格式= IntBuffer.allocate(numFormats.get(0));
                GLES20.glGetIntegerv(GLES20.GL_SHADER_BINARY_FORMATS,格式);                对(INT I = 0; I&下; numFormats.get(0); ++ⅰ){
                    Log.d(格式+ I +,formats.get(我)+);                    GLES20.glShaderBinary(1,vert2,formats.get(i)中,BBV,bv.length);
                    GLES20.glShaderBinary(1,frag2,formats.get(i)中,BBF,bf.length);
                    checkGlError(编译顶点着色器);
                }            }
            in_sv.close();
            in_sf.close();
            BF = NULL;
            BV = NULL;        }赶上(例外五){
            // e.printStackTrace();
            Log.e(错误:无法读取的资源。,);
        }        sampler_program = GLES20.glCreateProgram();
        如果(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 =新INT [1];
            GLES20.glGetProgramiv(sampler_program,GLES20.GL_LINK_STATUS,
                    linkStatus,0);
            如果(linkStatus [0]!= GLES20.GL_TRUE){
                Log.e(TAG,无法链接程序:);
                Log.e(TAG,GLES20.glGetProgramInfoLog(sampler_program));
                GLES20.glDeleteProgram(sampler_program);
                sampler_program = 0;
            }
        }
        checkGlError(链接后);
        如果(sampler_program == 0){
            Log.e(TAG,在创建和编译的着色器程序错误);
            返回-1;
        }        返回sampler_program;
    }

我与此问题挣扎4天。难道我做错了什么?请帮我理清这个问题。

感谢您,

Dhammike

编辑:

当我得到的崩溃日志与NDK协议栈,这是我所得到的

的***的 崩溃转储: 的**的 *

 生成指纹:三星/ GT-N7000 / GT-N7000:4.0.4 / IMM76D / XXLRK:用户/释放键
PID:11581,TID:11594>>> com.example.nativemedia<<<
信号11(SIGSEGV),code 1(SEGV_MAPERR),故障地址deadbaad
堆栈帧#00件00017938 /system/lib/libc.so
堆栈帧#01件000137c2 /system/lib/libc.so
堆栈帧#02件00015b00 /system/lib/libc.so(dlfree)
堆栈帧#03件00016178 /system/lib/libc.so(免费)
堆栈帧#04件00025e04 /system/lib/libMali.so(__mali_program_binary_state_reset)
堆栈帧#05件00016068 /system/lib/egl/libGLESv2_mali.so(_gles_program_rendering_state_deref)
堆栈帧#06件000281b4 /system/lib/egl/libGLESv2_mali.so_gles2_program_internal_free)
堆栈帧#07件00028228 /system/lib/egl/libGLESv2_mali.so(_gles2_program_object_list_entry_delete)
堆栈帧#08件0002da9c /system/lib/egl/libGLESv2_mali.so(_gles_share_lists_clear_v2_content)
堆栈帧#09件000110d4 /system/lib/egl/libGLESv2_mali.so(_gles_share_lists_deref)
堆栈帧#10件00026b88 /system/lib/egl/libGLESv2_mali.so(_gles2_delete_context)
堆栈帧#11件00013efc /system/lib/egl/libEGL_mali.so(__egl_gles_release_context)
堆栈帧#12件0000b07c /system/lib/egl/libEGL_mali.so(__egl_release_context)
堆栈帧#13件0000b0d4 /system/lib/egl/libEGL_mali.so(_egl_destroy_context_internal)
堆栈帧#14件0000b6e8 /system/lib/egl/libEGL_mali.so(_egl_destroy_context)
堆栈帧#15件0000c720 /system/lib/egl/libEGL_mali.so(eglDestroyContext)
堆栈帧#16件0000c346 /system/lib/libEGL.so(eglDestroyContext)
堆栈帧#17件0004b67e /system/lib/libandroid_runtime.so
堆栈帧#18件0001edb0 /system/lib/libdvm.so(dvmPlatformInvoke)
堆栈帧#19件00059168 /system/lib/libdvm.so(_Z16dvmCallJNIMethodPKjP6JValuePK6MethodP6Thread)


解决方案

我曾经有过同样的错误正在中止:IN dlfree无效的堆地址。在我的计划

问题无处从那里信号被抛出。
而有一个内存破坏在我的code一个完全无关的地方发生。

我花了一点时间让我看着办吧,但修复解决了这个问题的内存损坏。尝试禁用您的code部分,并找到内存损坏。

希望这有助于。

Device : Samsung Galaxy Note Android version: 4.0.4

My application apply some visual effects to a video stream using OpenGL Shaders. I need to use binary shaders for security reasons. I am using glSurfaceView and SurfaceTexture to access the frame data in OpenGL shaders and using the extension GL_OES_EGL_image_external. This is working fine as far as I am using shader source. When I try to use compiled shader binaries I often get an error A/libc(4242): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1) and the program crashes. When It is working when I try to close the app with back key I usually get the error A/libc(4907): @@@ ABORTING: INVALID HEAP ADDRESS IN dlfree

I tried to use binary shaders in the native-media sample application in android xref : http://androidxref.com/source/xref/development/ndk/platforms/android-14/samples/native-media/

and I get the same errors.

I am creating binary shaders using the compiler provided by ARM malisc and the code I use for loading the binaries are

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;
    }

I am struggling with this problem for 4 days. Am I doing anything wrong? Please help me to sort this issue.

Thank you,

Dhammike

Edit:

When I get the crash log with ndk-stack this is what I get

*** Crash dump: ***

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)

解决方案

I once had the same error "ABORTING: INVALID HEAP ADDRESS IN dlfree" in my program.

The issue was nowhere from where the signal was thrown. Rather there was a memory corruption happening at a totally unrelated place in my code.

It took a bit of time for me to figure it out, but fixing the memory corruption fixed this problem. Try to disable parts of your code and locate the memory corruption.

Hope this helps.

这篇关于致命的信号11并使用glShaderBinary当IN dlfree错误无效堆地址的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆