在我的安卓OpenGL ES项目中,我最近在着色器代码中遇到了一个错误,这显然导致了OpenGL线程中的"致命信号11(SIGSEGV(":
GLES32.glCompileShader(glShaderHandle);
我解决了错误,它再次工作正常,但我很难找出该错误的来源。当然,我尝试"捕获"着色器错误,如下所示:
GLES32.glGetShaderiv(glShaderHandle, GLES32.GL_COMPILE_STATUS, result, 0);
但是在SIGSEGV错误的情况下,java代码甚至没有达到这一点。尝试使用try/catch捕获错误也不起作用。应用程序仍然崩溃。我想错误发生在本机 c 代码中。
有没有办法处理来自java代码的此类错误以防止应用程序崩溃?
你抓不到它。 这是一个段错误。 它在 C 中崩溃。 它不会变成 Java 堆栈跟踪,它被 linux 视为硬错误,应用程序会立即终止。
你也许可以编写一个 C 信号处理程序并进行一些处理,但我真的不推荐它。 从这一点开始,您将无法以任何方式继续应用,因为应用程序现在处于未定义的行为状态。
如果您确实想尝试这样做(我真的不建议这样做(,请阅读如何编写信号处理程序来捕获 SIGSEGV?以获取问题的概述。