Android: поймать сигнал SIGSEGV JNI

1

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

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

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

Спасибо

  • 1
    Ни один из ответов на любые другие ваши вопросы не был приемлемым ???
Теги:
signals
tesseract
jni
sigsegv

2 ответа

1

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

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

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

0

Поскольку никто не помогает. Я хотел бы указать на то, что вопрос о намерении или цели является неуважительным. Нам нужны факты, а не мнения или спекуляции. Кажется, это привычка. В моем случае я хочу поймать 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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню