java - 如何捕捉“致命信号 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 代码的此类错误以防止应用程序崩溃?
解决方案
你不能抓住它。这是一个段错误。它在 C 中崩溃。它不会变成 Java 堆栈跟踪,它被 linux 视为硬故障,并且应用程序立即终止。
您也许可以编写一个 C 信号处理程序并进行一些处理,但我真的不推荐它。从这一点开始,您将无法以任何方式继续该应用程序,因为该应用程序现在处于未定义的行为中。
如果您确实想尝试(我真的不建议这样做),请阅读如何编写信号处理程序来捕获 SIGSEGV?有关问题的概述。
推荐阅读
- java - 我想使用 firebaseListAdapter 填充列表视图,但它什么也没做
- c# - Unity Web Request Post 不发送数据
- python - 我必须使用 scoket 编程将图像文件(jpg)从一个位置(分区的 Windows 10)获取到 jupyter notebook 中的 python 程序,
- sql - 在 SQL 查询中按条件添加行重复
- .net - nuget 命令未在詹金斯管道中重新调整
- axios - axios稳定吗?
- php - 无法在多个php页面中获取登录用户信息
- amazon-web-services - 如何为 ec2 SpotFleet 实例定义 SecurityGroups 的对象列表
- javascript - 链接 index.html client.js 和 server.js
- java - 我想获取用户的 UID 以将特定评级存储在他们的详细信息中,但我无法访问特定用户