Как поймать «Фатальный сигнал 11 (SIGSEGV)»? - PullRequest
2 голосов
/ 05 апреля 2019

В моем проекте Android OpenGL ES у меня недавно была ошибка в моем шейдерном коде, который, по-видимому, вызвал «фатальный сигнал 11 (SIGSEGV)» в ветке OpenGL здесь:

GLES32.glCompileShader(glShaderHandle);

Я исправил ошибку, и она снова работает нормально, но мне было трудно выяснить, откуда появилась эта ошибка. Конечно, я пытаюсь «поймать» ошибки шейдера, как это:

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

Но в случае ошибки SIGSEGV код Java даже не дошел до этой точки. Также попытка отловить ошибку с помощью try / catch не сработала. Приложение все равно падает. Я думаю, что ошибка происходит в нативном коде c.

Есть ли способ обработки таких ошибок из кода Java, чтобы предотвратить сбой приложения?

1 Ответ

5 голосов
/ 05 апреля 2019

Вы не можете поймать это.Это сегфоЭто сбой в C. Он не превращается в трассировку стека Java, он рассматривается Linux как серьезная ошибка, и приложение немедленно закрывается.

Возможно, вы сможете написать обработчик сигнала C и сделатьнекоторая обработка, но я действительно не рекомендовал бы это.И вы не сможете продолжать приложение каким-либо образом с этого момента, поскольку приложение теперь находится в неопределенном поведении.

Если вы действительно хотите попробовать это (я действительно не предлагаю это), прочитайте Как написать обработчик сигнала для перехвата SIGSEGV? для обзора проблем.

...