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

问题描述 投票:2回答:1

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

GLES32.glCompileShader(glShaderHandle);

我解决了错误,它再次正常工作,但我很难找到错误来自哪里。当然我试着像这样“捕获”着色器错误:

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

但是在SIGSEGV错误的情况下,java代码甚至没有达到这一点。还尝试用try / catch捕获错误不起作用。该应用程序无论如何崩溃。我猜错误发生在本机c代码中。

有没有办法从Java代码处理这样的错误,以防止应用程序崩溃?

java android opengl-es sigsegv
1个回答
5
投票

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

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

如果你想尝试(我真的不建议),请阅读How to write a signal handler to catch SIGSEGV?以了解问题的概述。

© www.soinside.com 2019 - 2024. All rights reserved.