首页 > 解决方案 > 如何捕捉“致命信号 11 (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 代码的此类错误以防止应用程序崩溃?

标签: javaandroidopengl-essegmentation-fault

解决方案


你不能抓住它。这是一个段错误。它在 C 中崩溃。它不会变成 Java 堆栈跟踪,它被 linux 视为硬故障,并且应用程序立即终止。

您也许可以编写一个 C 信号处理程序并进行一些处理,但我真的不推荐它。从这一点开始,您将无法以任何方式继续该应用程序,因为该应用程序现在处于未定义的行为中。

如果您确实想尝试(我真的不建议这样做),请阅读如何编写信号处理程序来捕获 SIGSEGV?有关问题的概述。


推荐阅读