2014-07-16 4 views
0

Java 프로그램 실행을 위해 작동하는 GDB 7.4를 사용하여 Netbeans 7.2에 (사용자 정의 된) 1.8 HotSpot VM을 구축했습니다. 개체 헤더를 손상시키는 JNI에 의해 호출되는 네이티브 함수를 호출하여 프로그램이 생성하는 SIGSEGV를 디버깅하려고합니다.Netbeans에서 핫스팟 VM 디버깅

그러나 HotSpot VM을 디버깅 할 때 몇 가지 문제가 있습니다. java.c의 주 함수 호출 전에 여러 개의 중단 점이 있습니다. 때로는 트리거하고 때로는 모든 중단 점 중단 전에 주요 기능을 실행합니다. 가장 지금까지 내가 얻을 수는 그 후

/* Invoke main method. */ 
(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs); 

이다, 스텝에서 결국 SIGSEGV를 트리거링, 전체 자바 프로그램을 통해 실행됩니다. 호출은 JNI API로 이어 지므로 "hotspot/src/share/vm/prims"디렉토리를 디버그 섹션의 소스 디렉토리에 포함 시켰습니다. 그러나 나는 어떤 효과도 볼 수 없었다. 아무도 내가 어떻게 자바 기본 메소드를 호출하는 C++ 메소드에 들어갈 수 있는지 생각하고 있는가?

SIGSEGV로 인해 Netbeans 디버그보기가 중지되면 호출 스택에 예상 호출 스택이 표시됩니다. 그러나 C++ 코드 대신 C++ 클래스의 이름을 표시하는 동안 어셈블러 코드 만 표시합니다. 초기 호출자는 "??()"입니다. C++ 코드를 볼 수있는 방법이 있습니까? 아니면 수동으로 어셈블러 코드를 C++ 코드에 매핑해야합니까? article by Volker Simonis 위의 코드에서 알 수없는 프레임과 관련이 있다고 설명합니다. 그러나, 나는 여전히 연속적인 호출자 프레임이 클래스와 메소드 이름을 보여 주는 것을 당혹 스럽다. 소스 조회에 문제가 있거나 단순히 알려지지 않은 첫 번째 프레임과 관련이 있습니까?

답변

0

debug 모드에서 핫스팟을 컴파일 했습니까? 이자형. make all_debug? 핫스팟이 최적화 된 경우 코드는 소스 파일과 다른 순서로 실행될 수 있으며 일부 기호는 제거되어 디버거가 의미있는 정보를 제공하거나 중단 점을 설정할 수 없습니다.

관련 문제