Я использую проект tesseract для преобразования изображения в строку. Однако сигнал SIGSEGV отправляется (случайно?) Из него JNI.
Я хотел перезапустить свое приложение, когда сигнал был отправлен, но я не нашел никакого решения "поймать" сигнал с помощью Java.
У кого-нибудь есть предложения?
Спасибо
В то время как вы можете поймать SIGSEGV с помощью собственного обработчика сигналов, вам может не показаться очень легким сделать что-нибудь полезное с точки зрения взаимодействия с айпидом android изнутри обработчика.
Возможно, самое лучшее, что нужно сделать, это понять и исправить проблему.
В терминах обходного пути - и это действительно очень плохое решение - вы могли бы предположительно либо использовать AlarmManager для установки события на несколько секунд в будущем, и отменить его/вытолкнуть дальше, если вы все еще будете работать после "рискованной" операции. Или вы можете запустить службу (не работать в том же процессе), которая перезапустит ваше приложение, если соединение службы будет потеряно.
Поскольку никто не помогает. Я хотел бы указать на то, что вопрос о намерении или цели является неуважительным. Нам нужны факты, а не мнения или спекуляции. Кажется, это привычка. В моем случае я хочу поймать 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;