2012-07-04 2 views
7

인터페이스로 제공된 JNI 클래스를 통해 써드 파티 네이티브 모듈에 액세스하는 Java 1.6 애플리케이션이 있습니다. 최근에 우리는 SEGFAULT가 네이티브 모듈에서 발생하고 있으며 응용 프로그램이 충돌하고 있음을 확인했습니다. 적어도 죽기 전에 제대로 기록하기 위해이 사건을 잡아서 처리 할 수 ​​있습니까?SEGFAULT를 원시 코드로 orginating 처리 할 수 ​​있습니까?


두 Java 기술을 모두 kjp's answer에서 시도했습니다. 어느 쪽도 효과가 없었다. 예외 이미 VM에서 사용

신호에 'SEGV'결과에 signal handler를 설치하려고 : SEGV

내가 설치된 shutdown handler은 단순히 아마도 때문에 무엇 IBM article 상태, 화재 못했습니다

Runtime.halt() 메소드가 종료를 호출하는 경우

종료 후크가 실행되지 않습니다 JVM Runtime.halt()는 JVM을 빠르게 종료 할 수 있도록 제공됩니다.
-Xrs JVM 옵션이 지정되었습니다.
JVM은 JVM 소프트웨어에 의해 생성 된 예외 조건 또는 강제 중단과 같이 비정상적으로 종료됩니다.

+0

네이티브 코드에 공개 디버깅 기호를 사용할 수 있습니까? 이유에 대해 자세히 알 수 있다면 포괄적 인 버그 보고서를 제출하여 라이브러리를 수정할 수 있습니다. – Benj

+0

@Benj 병렬로 작업. 그들이 원하는 것보다 더 많은 정보를 얻게 될 것입니다. 백업 계획이 있기를 바랬습니다. –

+0

어떤 OS를 실행하고 있습니까? – Benj

답변

2

로그하고 알림을 보내려면 응용 프로그램을 실행하는 스크립트를 작성하면됩니다. 응용 프로그램이 죽었을 때, 스크립트는 응용 프로그램이 일반적으로 모든 충돌/SEGV 정보를 가지고있는 hs_errXXXX 파일에서 종료 여부를 감지하고 다른 사람에게 메일 (당신이 원하는 경우 응용 프로그램을 다시 시작)


수 있습니다 당신 다른 JVM에서 오류가있는 JNI 코드를 실행하고 RMI 또는 JMS 또는 소켓을 사용하여 해당 JVM과 통신해야합니다. 이렇게하면 라이브러리가 없어지면 주 응용 프로그램이 종료되지 않고 다시 시작할 수 있습니다.

+1

이와 관련하여 몇 가지 중요한 성능 관련 사항 ... 나는이 길로 가도록 유혹하는 유일한 방법이 될 것입니다. – Benj

1

당시 수 주간의 연구와 컨퍼런스에서 JVM 엔지니어와의 대화를 기반으로 한 것은 불가능합니다. 시스템은 SEGV 신호에 SignalHandler를 설치할 수 없습니다.

관련 문제