OpenGL ES程序運行報錯:
A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 21994 (GLThread 5518)
Debug定位問題是在Renderer 的onSurfaceCreated方法中,創(chuàng)建Program代碼塊。
override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
GLES20.glClearColor(1.0f, 1.0f, 1.0f, 1.0f)
createProgram(vertexShaderCode, fragmentShaderCode)
……
}
進一步定位具體調(diào)用代碼處為編譯著色器代碼時,調(diào)用GLES20.glCreateShader()發(fā)生崩潰:
private fun compileShader(shaderType: Int, shaderCode: String): Int {
val shaderObjectId = GLES20.glCreateShader(shaderType)
checkGlError("glCreateShader")
if (shaderObjectId == 0) {
return 0
}
……
}
難道是不在GLThread中?顯然經(jīng)過反復(fù)確認代碼調(diào)用鏈,是在onSurfaceCreated中調(diào)用的glCreateShader,這就很詭異了。。。
先排除createProgram 函數(shù)中代碼塊是否有鬼。將glCreateShader單獨拎出來調(diào)用試一試:
override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
GLES20.glClearColor(1.0f, 1.0f, 1.0f, 1.0f)
GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER)
// createProgram(vertexShaderCode, fragmentShaderCode)
……
}
程序運行,崩潰依舊,還是鮮紅的 libc: Fatal signal 11 。那問題到底出在哪呢?
只能將OpenGL 相關(guān)代碼逐行排查了,然后從初始化Renderer的代碼處發(fā)現(xiàn)下面代碼:
override fun initData() {
……
mRender = ImageRender(
context = this,
vertexSourceId = R.raw.image_vert,
fragmentSourceId = R.raw.image_frag
)
binding.glSurfaceView.setRenderer(mRender)
……
}
仔細一看,漏調(diào)用了關(guān)鍵函數(shù)setEGLContextClientVersion
補上后,程序運行正常。