2010-01-20 5 views
0

JNI C++ 클래스를 통해 C++ 클래스를 호출하여 libmagic.so에서 제공하는 'file'명령 기능에 액세스하는 Java 클래스가 있습니다.Java 1.6을 사용하는 Redhat AS 4 seg fault 호출 magic_buffer

  • 는 C++ 클래스는 컴파일 및 메인 A C++()

- 그것은 자바 1.5과 1.6을 실행 RHEL 5에서 잘 작동으로 잘 실행; RHEL 4 실행중인 자바에서 잘 작동합니다 - 그것은

는이 독방 감금 자바와 RHEL 4에 26,234 고장 발생 - 그것은 1.5

1.6

독방 감금 오류 :

  1. 은에서 발생 call char * retptr = magic_buffer (쿠키, bigbuf, 1000); char * retptr = "좋은 안전한 문자열"인 경우 오류가 발생하지 않습니다. 치환 됨. 이것이 seg fault가이 호출에서 발생한다고 결론을 짓는 이유입니다.

  2. 대체 호출 인 char * retptr = magic_file (쿠키, "/ usr/include/magic.h")을 사용합니다. 이 호출은 파일 내용이 가득 찬 버퍼가 아니라 파일의 완전한 경로 이름 만 요구하는 동일한 파일 유형 메시지를 반환하므로 버퍼 문제를 디버깅합니다. 또한 RHEL4/java 1.6 테스트 VM에 seg 오류가 발생합니다. 따라서 문제는 내 코드에서 잘못된 포인터 또는 넘치는 버퍼로 보지 않는다고 결론 내릴 수 있습니다.

  3. magic_buffer는 libmagic.so에 대한 호출입니다. 이전에 코드에서이 lib에 대한 다른 성공적인 호출이 이루어졌습니다. 그러나이 호출에는 lib 마법 데이터베이스/usr/share/file/magic이 관련됩니다.

  4. C++을 실행 파일로 컴파일하고 문제가있는 컴퓨터에서 실행하면 정상적으로 작동합니다. 여기

어떤 결론입니다 :

A. JNI의 참여가 # 4

B.의 # 1/# 2, 나는 그것이 JNI 구현이라고 생각하지 않기 때문에 때문에,이 발행물.

C. # 1, # 2 및 # 4 때문에 나는 이것이 C++ 구현 문제라고 생각하지 않습니다.

의견이나 제안이 있으십니까? (처음에는 VMWare에서 실행되었으므로 이제는 VM 관련 문제없이 테스트 됨)

+0

업데이트 후에 발생 했습니까? RHEL4의 Java 1.5로 돌아갈 수 없습니까? – stacker

+0

JNI 전문가가 검토 할 C++ 코드를 게시 한 경우 도움이 될 수 있습니다. –

+0

업데이트가 관련되지 않았습니다. 이것은 새로운 개발을 테스트하고 있습니다. RHEL4/5와 Java 1.5/1.6이 혼합 된 환경이 있습니다.나는 무엇이 잘못되었는지에 대한 이해가없는 해결 방법을 찾기보다는 문제의 원인을 밝히고 싶습니다. – cvsdave

답변

0

첫 번째 제안은 순수한 Java 대안을 찾으려고 시도하는 것입니다. This page에는 여러 가지 대안이 나열되어 있습니다. Apache Tika와 JMimeMagic은 유망 해 보입니다.

두 번째 제안은 Process을 사용하여 file 명령을 별도의 프로세스에서 실행하고 명령의 표준 출력에서 ​​필요한 정보를 긁는 것입니다. 이 작업을 1 초에 수백 번 수행해야하는 경우 성능 문제가 발생할 수 있지만 가끔씩 사용하면 문제가되지 않습니다.

+0

성능은 우리가 모든 인스턴스에 대해 새로운 프로세스를 생성하는 대안을 찾고있는 이유입니다. – cvsdave

+0

다음 제안 # 1 참조 :-) –

+0

제안 # 1 도움이되지 않습니다. seg 오류가 발생한 행 위에 위 게시했습니다. 왜 버퍼 문제가 탓이라고 생각하지 않습니다. 추가 코드를 추가하면 문제가 불투명 해집니다. 다음은 몇 가지 코드입니다. char * cptr = null; cptr = magic_file (쿠키, "/ usr/include/magic.h"); 그 줄은 seg 오류가 발생한 곳입니다. 그 줄은 위에 나와 있습니다. 위의 설명은 코드가 Java 1.5에서 작동하고 특정 Redhat 버전에서 1.6으로 만 seg fault를 throw합니다. C++ 코드는 모든 OS 버전 및 (물론) Java 버전에서 잘 컴파일되고 실행됩니다. – cvsdave

관련 문제