Jak mogę złapać SIGSEGV (błąd segmentacji) i uzyskać śledzenie stosu w JNI na Androida?

ruszam sięprojekt do nowego zestawu Native Development Kit dla systemu Android (tj. JNI) i chciałbym przechwycić SIGSEGV, gdyby wystąpił (być może również SIGILL, SIGABRT, SIGFPE), aby przedstawić ładne okno raportowania awarii zamiast (lub przed) tego, co aktualnie zdarza się: natychmiastowa, bezceremonialna śmierć procesu i ewentualnie próba ponownego uruchomienia systemu przez system operacyjny. (Edytować: JVM / Dalvik VM wychwytuje sygnał i rejestruje ślad stosu oraz inne przydatne informacje; Chcę tylko zaoferować użytkownikowi opcję wysyłania e-mailem tych informacji do mnie.)

Sytuacja wygląda następująco: duża część kodu C, którego nie napisałem, wykonuje większość pracy w tej aplikacji (cała logika gry) i chociaż jest dobrze przetestowana na wielu innych platformach, jest całkiem możliwe, że ja na moim Androidzie port, wyrzuci go do śmieci i spowoduje awarię kodu natywnego, więc chcę zrzuty awaryjne (zarówno natywne, jak i Java), które obecnie pojawiają się w dzienniku Androida (domyślam się, że będzie to stderr w sytuacji innej niż Android). Mogę dowolnie modyfikować kod C i Java dowolnie, chociaż liczba wywołań zwrotnych (zarówno wchodzących, jak i wychodzących z JNI) wynosi około 40 i oczywiście punkty bonusowe dla małych różnic.

Słyszałem o bibliotece łańcuchów sygnałowych w J2SE, libjsig.so, a jeśli mógłbym bezpiecznie zainstalować program obsługi sygnału w ten sposób na Androidzie, to rozwiązałoby to problem z częścią mojego pytania, ale nie widzę takiej biblioteki dla Androida / Dalvika .

questionAnswers(4)

yourAnswerToTheQuestion