Android: поймать сигнал SIGSEGV JNI - PullRequest
1 голос
/ 24 мая 2011

Я использую проект tesseract для преобразования изображения в строку.Однако сигнал SIGSEGV отправляется (случайным образом?) С его JNI.

Я хотел перезапустить свое приложение при отправке сигнала, но я не нашел никакого решения, чтобы «перехватить» сигнал с помощью Java.

У кого-нибудь есть предложения?

Спасибо

Ответы [ 2 ]

1 голос
/ 24 мая 2011

Хотя вы можете поймать SIGSEGV с помощью встроенного обработчика сигналов, вам может показаться, что не очень легко сделать что-либо полезное с точки зрения взаимодействия Android-API изнутри обработчика.

Вероятно, лучше всего понять и устранить проблему.

С точки зрения обходного пути - и это действительно очень плохое решение - вы, вероятно, можете использовать AlarmManager, чтобы установить событие внесколько секунд в будущем, и отмените его / вытолкните его дальше, если у вас все еще будет работать после «рискованной» операции.Или вы можете запустить сервис (не запущенный в том же процессе), который перезапустит ваше приложение, если соединение с сервисом потеряно.

0 голосов
/ 12 августа 2015

Так как никто не помогает.Я хотел бы отметить тот факт, что ставить под сомнение намерение или цель неуважительно.Мы хотим факты, а не мнения или спекуляции.Это, кажется, привычка здесь.В моем случае я хочу поймать SIGSERV, потому что я хочу обнаружить уязвимость в общей библиотеке.По соображениям безопасности не существует другого надежного способа обнаружить указанную уязвимость без нежелательных ложных срабатываний.Вот что я нашел пару дней назад:

> #include <stdio.h>
> #include <stdlib.h>
> #include <dlfcn.h>
> 
> 
> int main(int argc, char **argv) {
>     void *handle;
>     void* (*doSomething)(char);
>     char *error;
>     handle = dlopen ("libexample.so", RTLD_LAZY);
>     if (!handle) {
>         fprintf (stderr, "%s\n", dlerror());
>         exit(1);
>     }
>     dlerror();    /* Clear any existing error */
>     foo = dlsym(handle, "doSomething");
>     if ((error = dlerror()) != NULL)  {
>         fprintf (stderr, "%s\n", error);
>         exit(1);
>     }
>     printf ("%f\n", (*setDataSource)("/data/data/com.example.ap/files/cve_2015_2396.mp4"));
>     dlclose(handle);
>     return 0;
...