Android 使用glShaderBinary时dlfree错误中出现致命信号11和无效堆地址
设备:三星Galaxy Note 安卓版本:4.0.4 我的应用程序使用OpenGL着色器对视频流应用一些视觉效果。出于安全原因,我需要使用二进制着色器。我正在使用Android 使用glShaderBinary时dlfree错误中出现致命信号11和无效堆地址,android,opengl-es-2.0,opengl-shader-builder,Android,Opengl Es 2.0,Opengl Shader Builder,设备:三星Galaxy Note 安卓版本:4.0.4 我的应用程序使用OpenGL着色器对视频流应用一些视觉效果。出于安全原因,我需要使用二进制着色器。我正在使用glSurfaceView和SurfaceTexture访问OpenGL着色器中的帧数据,并使用扩展名GL\u OES\u EGL\u image\u external。就我所使用的着色器源而言,这工作得很好。当我尝试使用编译的着色器二进制文件时,我经常在0x00000000(code=1)处得到一个错误A/libc(4242):致命
glSurfaceView
和SurfaceTexture
访问OpenGL着色器中的帧数据,并使用扩展名GL\u OES\u EGL\u image\u external
。就我所使用的着色器源而言,这工作得很好。当我尝试使用编译的着色器二进制文件时,我经常在0x00000000(code=1)处得到一个错误A/libc(4242):致命信号11(SIGSEGV)
,程序崩溃。当它工作时,当我尝试用back键关闭应用程序时,通常会出现错误
A/libc(4907):@@@中止:dlfree中的堆地址无效
我尝试在android xref中的本机媒体示例应用程序中使用二进制着色器:
我也会犯同样的错误
我正在使用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;
}
private int 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));
试一试{
_sv中的InputStream=resource.openRawResource(R.raw.v2);
InputStream in_sf=resource.openRawResource(R.raw.f2);
byte[]bv=新字节[在可用的空间中];
以绝对速度读取(bv);
//=IOUtils.toByteArray(单位为_sv);
ByteBuffer bbv=ByteBuffer.wrap(bv);
字节[]bf=新字节[在可用的()中];
//IOUtils.toByteArray(单位:sf);
在sf.read(bf)中;
ByteBuffer bbf=ByteBuffer.wrap(bf);
IntBuffer numFormats=IntBuffer.allocate(1);
GLES20.glGetIntegerv(GLES20.GL_NUM_着色器_二进制_格式,
numFormats);
IntBuffer格式;
if(numFormats.get(0)>0){
formats=IntBuffer.allocate(numFormats.get(0));
GLES20.glGetIntegerv(GLES20.GL_着色器_二进制_格式,格式);
对于(int i=0;i
我为这个问题挣扎了4天。我做错什么了吗?请帮我整理一下这个问题
谢谢,
达米克
编辑:
当我用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)
Build fingerprint:'samsung/GT-N7000/GT-N7000:4.0.4/IMM76D/XXLRK:user/release key'
pid:11581,tid:11594>>com.example.nativemedia我的程序中曾经出现过相同的错误“中止:dlfree中的无效堆地址”
问题不在信号发出的地方。
相反,在我的代码中有一个完全不相关的地方发生了内存损坏
我花了一点时间才弄明白,但修复了内存损坏修复了这个问题。尝试禁用部分代码并查找内存损坏
希望这能有所帮助。谢谢你的建议。我尝试了这种方法,当我注释掉上面的方法ShaderFromBIN(参考资料资源)时,错误就消失了。无论如何,我将尝试检查其他地方是否存在内存损坏。在与此问题斗争了一段时间后,我发现问题出在马里脱机着色器编译器上。此问题在最新的脱机着色器编译器中排序。