Android NDK: обрабатывать SIGSEGV, вызванные любым потоком со стороны Java

Рассмотрим этот сценарий:

Есть Android-приложение, которое делает вещи, которые могут быть в разных потоках. Некоторые из них могут вызвать нарушения сегментации (SIGSEGV). Я хочу иметь возможность отлавливать все нарушения, независимо от потока, который их вызвал, из обработчика сигнала, написанного на C с использованием NDK.

На самом деле, я написал такой обработчик с помощью sigaction, И это работает, но только для потока, который будет выполнять код NDK. Это потому, что SIGSEGVs доставляются в поток, вызвавший нарушение, в противоположность, скажем, SIGKILL, который доставляется процессу. В результате мой обработчик не получает SIGSEGV, вызванные другими потоками, и программа уничтожается.

Есть ли способ заставить все SIGSEGV перенаправляться на мой обработчик? Или, альтернативно, способ переопределить обработчик по умолчанию для ВСЕХ потоков?

И да, есть причина, по которой я хочу именно эту вещь так, как я ее описал!;)

1 ответ

Вы можете поймать SIGSEGV, но вы не можете освободить ресурсы, которые были бы свободны, если это SIGSEGV не произошло. В Java есть сборщик мусора (а в некоторых случаях даже gc не спасает от утечек памяти), но код c/ C++ должен либо free() или же delete или же delete[] что он выделил (но не alloca()-ed).

Я бы поместил вещи, которые делают рискованные нативные вещи, в отдельный процесс. (Приложения Android могут состоять из нескольких процессов.) Когда процесс умирает, его мусор также умирает. И основной процесс должен был бы обнаружить, что рабочий процесс умер.

Другие вопросы по тегам