2010-12-08 3 views
2

SWIG로 싸서 Java에서 호출하는 C++ 코드의 큰 본문이 있습니다. C++ 코드는 부스트 스마트 포인터를 자유롭게 사용합니다.Eclipse에서 SWIG로 래핑 된 C++ 코드 디버깅에 대한 팁?

일부 JUnit 테스트가 완료되었지만 정리 중에 seg faults가 발생합니다. 스택 추적은 객체의 마무리에서 메모리 오류를 나타내지 만 SWIG에서 생성 된 JNI 코드에서 발생하며 스마트 포인터 참조 카운팅과 관련이있는 것 같습니다.

코드의 모든 단계를 단계별로 수행하고 싶습니다. 이것이 가능한가? 이런 종류의 문제에 대한 다른 사람들의 경험을 듣고 매우 행복합니다.

+0

적어도 평소 사용하는 C++ 디버거에서 Java 프로세스를 시작하고 JNI 코드에 중단 점을 넣을 수 있어야한다고 가정합니다. 코드의 모든 레이어를 단계별로 실행하지는 않지만 ... –

답변

1

실행중인 Java 코드에 두 번째 원시 코드 디버거를 연결할 수 있습니다. 예를 들어, Visual Studio의 경우 "디버그> 첨부를 통해 프로세스에 첨부 할 수 있습니다."

SWIG는 스마트 포인터를 지원하지만 Java에서 명시 적으로 수명을 관리해야합니다. Java 측에서 스마트 포인터 객체의 소유권을 얻는 경우이를 삭제해야합니다. Java에는 범위를 벗어나는 객체 임시 변수가 없으므로 각 레벨의 반환 값이 스마트 포인터 인 f(). h()와 같은 표현식을 사용할 수 없습니다.

가비지 수집이 발생하면 SWIG 생성 Finalizer에서 오류를 삭제하려고 시도합니다. 객체가 C++ 측에서 이미 삭제 된 경우 failsafe가 해로울 것입니다.

관련 문제