如何捕获“致命信号11(SIGSEGV)”?

时间:2019-04-05 17:07:49

标签: java android opengl-es sigsegv

在我的android OpenGL ES项目中,我的着色器代码最近出现错误, 显然在此处的OpenGL线程中造成了“致命信号11(SIGSEGV)”:

GLES32.glCompileShader(glShaderHandle);

我解决了该错误,并且再次正常运行,但是我很难找出该错误的出处。当然,我会尝试像这样“捕获”着色器错误:

GLES32.glGetShaderiv(glShaderHandle, GLES32.GL_COMPILE_STATUS, result, 0);

但是在发生SIGSEGV错误的情况下,Java代码甚至没有达到这一点。另外尝试使用try / catch捕获错误也没有用。该应用程序仍然崩溃。我猜该错误发生在本机C代码中。

是否可以通过Java代码处理此类错误,以防止应用崩溃?

1 个答案:

答案 0 :(得分:5)

您无法抓住它。这是段错误。它在C中崩溃。它没有变成Java堆栈跟踪,它被Linux视为硬故障,应用程序立即终止。

您也许可以编写C信号处理程序并进行一些处理,但是我真的不建议这样做。从那时起,您将无法以任何方式继续运行该应用程序,因为该应用程序现在处于未定义状态。

如果您确实想尝试(我真的不建议这样做),请阅读How to write a signal handler to catch SIGSEGV?,以概述问题。