새 Android Native Development Kit (예 : JNI)로 a project을 이동 중입니다. 멋진 충돌보고 대화 상자를 표시하기 위해 SIGSEGV를 잡으려고합니다 (SIGILL, SIGABRT, SIGFPE도 가능). 현재 일어나는 일 (또는 그 전에) : 즉각적인 예기치 않은 프로세스의 죽음과 OS가 다시 시도 할 수있는 시도. (편집 : JVM/Dalvik VM은 신호를 잡아서 스택 추적 및 기타 유용한 정보를 기록하므로 사용자에게 해당 정보를 나에게 이메일로 보낼 수있는 옵션을 제공하고 싶습니다.)안드로이드에서 JNI로 SIGSEGV (segmentation fault)를 잡아서 스택 트레이스를 얻으려면 어떻게해야합니까?
상황은 다음과 같습니다. a 필자가 작성하지 않은 C 코드의 많은 부분이이 애플리케이션 (모든 게임 로직)에서 대부분의 작업을 수행하며 수많은 다른 플랫폼에서 잘 테스트되었지만 안드로이드 포트에서 나는 그것을 먹을 가능성이 전적으로있다 쓰레기가 생겨서 원시 코드에서 충돌이 발생하므로 Android 로그에 현재 표시되는 크래시 덤프 (기본 및 Java 모두)를 원합니다 (Android 이외의 상황에서는 표준 오류 일 것으로 추측합니다). 콜백 (JNI로 들어가고 나오는 것 모두)은 약 40이고 분명히 작은 diffs에 대해서는 보너스 포인트이지만 C와 Java 코드를 임의로 수정할 수 있습니다.
J2SE, libjsig.so에서 신호 체인 라이브러리에 대해 들어 봤습니다. 안드로이드에서 신호 처리기를 안전하게 설치할 수 있다면 잡는 부분을 해결할 수 있지만 그 라이브러리는 없습니다. Android/Dalvik 용.
당신이 래퍼 스크립트를 통해 자바 VM을 시작할 수 있다면, 당신이 할 수있는 (코드 BSD 2 절 라이센스입니다) 앱이 비정상적으로 종료되었는지 확인하고 오류보고를 수행합니다. 그렇게하면 SIGSEGV, SIGKILL 등 무엇이든간에 비정상 종료의 모든 종류를 깨끗하게 잡을 수 있습니다. 그러나, 나는 재고 애플 리케이션이 가능하다고 생각하지 않습니다, 그래서 코멘트로 이것을 게시 (답변에서). – sleske
참조 : [Valgrind로 Java Android 프로그램을 실행할 수 없음] (http://stackoverflow.com/questions/13531496/cant-run-a-java-android-program-with-valgrind/19235439#19235439) for (adb 셸에서) 래퍼 스크립트로 안드로이드 앱을 시작하는 법. – sleske