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 могут состоять из нескольких процессов.) Когда процесс умирает, его мусор также умирает. И основной процесс должен был бы обнаружить, что рабочий процесс умер.