Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何抓住;致命信号11(SIGSEGV)“;?_Java_Android_Opengl Es_Segmentation Fault - Fatal编程技术网

Java 如何抓住;致命信号11(SIGSEGV)“;?

Java 如何抓住;致命信号11(SIGSEGV)“;?,java,android,opengl-es,segmentation-fault,Java,Android,Opengl Es,Segmentation Fault,在我的android OpenGL ES项目中,我最近在着色器代码中出现了一个错误, 这显然在OpenGL线程中导致了“致命信号11(SIGSEGV)”: GLES32.glCompileShader(glShaderHandle); 我解决了错误,它再次正常工作,但我很难找到错误的来源。当然,我尝试“捕捉”着色器错误,如下所示: GLES32.glGetShaderiv(glShaderHandle, GLES32.GL_COMPILE_STATUS, result, 0); 但是在SIG

在我的android 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信号处理程序并进行一些处理,但我真的不推荐这样做。从现在起,您将无法以任何方式继续应用程序,因为应用程序现在处于未定义的行为中


如果您确实想尝试这样做(我真的不建议这样做),请阅读有关问题的概述。

此segfault是否转储核心?是否有可能分析核心文件以确定错误发生的位置,以获得类似Java堆栈跟踪的内容?通常,您需要在Logcate中的该行下获得部分转储,但我不建议这样做。出于调试的目的,它看起来很好,为什么不呢?@SomeName因为它很难,所以要在不同版本的linux上正常工作就很难了,而且因为当你处于这种状态时,你实际上做不了很多事情——应用程序实际上无法安全地继续运行,并假设它可以正常工作。您知道您至少有一个无效指针,如果不是全部内存损坏的话。您正在为它掷骰子内存中的任何东西,包括应用程序代码本身,仍然有效。如果做得不对,将禁用已经存在的堆栈转储。好的。不管怎么说,这似乎是我手机的OpenGLES实现中的一个bug。当着色器代码中存在错误时,不应该存在分段错误,而是可以通过GL_COMPILE_STATUS读取的消息。为了便于学习,我将研究信号处理程序,但我不会在应用程序中实现它