2009-11-12 6 views
0

자바 호스트를 Gdal과 함께 사용합니다. JNI 바인딩 위에 구축 된 일부 서버 측 응용 프로그램이 있습니다. JNI 섹션에 오류가있는 경우 전체 JVM이 실패합니다.Java JNI 스택 폴 방지

C/C++ 라이브러리에 JVM 스택 폴을 유발할 수있는 치명적인 오류가 없다는 것을 테스트하는 가장 좋은 방법은 무엇입니까? 발생하는 오류를 깨끗하게 처리하는 가장 좋은 방법은 무엇입니까?

+0

테스트는 버그가있는 경우에만 알려줍니다. –

+0

아무 것도 없다면 알려주시겠습니까? : p – whatnick

답변

2

두 가지 마음에 와서 :

1). 별도의 프로세스 (RPC 기술을 사용하여 통신)로 C++ 코드를 실행할 가능성이 있다면 성능을 희생 시키더라도이 문제를 피할 수 있습니다.

2). C++/JNI 개발자의 자비하에 있습니다. 내가 격려 한 대부분의 문제는 JNI 계층의 "스킨"에 있습니다. 즉, JNI에 싸인 안정적인 기존 라이브러리가있었습니다. 실수로 기존 코드에 null 포인터를 전달하면 라이브러리가 불안해지며 응답으로 null을 확인하지 못하면 문제가 발생할 수 있습니다. 그래서 래퍼 레이어를 살균하는 데 많은 노력을 기울였습니다. 예기치 않은 결과가 발생할 가능성이있는 곳에서는 확인을 추가했습니다.

물론 전체 라이브러리가 새로운 것이라면 수명이 더 길어집니다. 결국에는 견고한 코드를 생성해야합니다.

+0

GDAL은 비교적 안정적으로 사용되는 C/C++ 라이브러리입니다. JNI wrapper 섹션에는 더 많은 사랑이 필요합니다. 나는 "피부"를 지나가는 살균 물질을 들여다 볼 것이다. – whatnick

2

이러한 JVM 설정을 사용하도록 설정 했습니까?

-verbose:jni -Xcheck:jni 

JNI 코드의 초기 개발에 매우 ​​유용합니다.

-Xcheck:jni 옵션은 JNI 기능을 둘러싼 랩퍼 기능 세트를 활성화합니다. 래퍼 함수는 들어오는 매개 변수에 대한 검사를 수행합니다. 이러한 검사에는 다음이 포함됩니다.

  • JNI를 초기화 한 호출과 호출이 같은 스레드에 있는지 여부.
  • 개체 매개 변수가 유효한 개체인지 여부입니다.
  • 로컬 또는 글로벌 참조가 유효한 개체를 참조하는지 여부.
  • 필드 유형이 Get<Type>Field 또는 Set<Type>Field 호출과 일치하는지 여부.
  • 정적 및 비 정적 필드 ID의 유효 여부.
  • 문자열이 유효하고 null이 아닌지 여부.
  • 배열 요소가 null이 아닌지 여부.
  • 배열 요소의 유형입니다.