2011-09-16 2 views
3

JVM에서 프로그래밍 방식으로 스택의 내용 (값의 유형과 값의 유형 및 현재 명령 포인트의 관점에서)을 검사 할 수 있습니까 (벤더에 따라 다름)?JVM 스택 인트로 피킹

예를 들어, 현재 활성화 프레임을 검사하고 그것이 속한 메소드 이름과 스택 변수를 추출하고 싶습니다. 또한,이 방법으로 활성화 프레임을 반복 할 수 있기를 바랍니다.

이것이 가능합니까? 언뜻보기에 JVMTI은 이것을 허용하는 것처럼 보이지만 기본 인터페이스로 사용하기위한 것입니다. 분명히 이런 일을 할 수있는 자바 라이브러리를 구현하는 것은 used입니다.하지만 이것은 약간 날짜가있는 것으로 보입니다. JVM API 나 다른 크로스 플랫폼 JVM 라이브러리에 통합 된 솔루션이 있는지 궁금합니다.

답변

2

저는 Java Platform Debugger Architecture (JPDA)을 찾고 있습니다.

+0

올바른지, 변수가 필요한 경우이 API를 사용하십시오. –

+1

다음은 메인 페이지에 대한 링크입니다. http://java.sun.com/javase/technologies/core/toolsapis/jpda/이 답변을 게시 한 명성! –

+0

좋은 하나, 고마워! 나는 지금 그것을 확인하고있다. – axel22

3

로컬 변수가있는 스택을 Object로 저장하는 Javaflow입니다. 또한이를 사용하여 스택을 저장된 상태로 복원 할 수 있습니다.

+0

감사합니다. Javaflow가 스택 컨텍스트를 열심히 (즉, 새 메서드 또는 연속 연산자가 호출 될 때마다) 저장할지, 아니면 연산자 Continuation.suspend가 호출 될 때만 수행할지 궁금합니다. – axel22

+0

나는 그것이 호출되었을 때만 상상한다. 그렇지 않으면 복원이 많이 사용되지 않을 것이다. ;) –

+1

'restore'는'continueWith'를 의미합니다. 아아, 예,'continueWith'를 여러 번 사용할 수 있다면 아마도 질문을 받았을 때만 스택을 저장합니다. 나는 공연에 관심이 있었고, 그래서 나는 물었다. Javaflow가 클래스 로딩 중에 바이트 코드를 계측하는 것 같습니다. 계측은 필요할 때 클래스 실행 후 런타임에 발생한다고 생각했습니다. 모든 방법에 도구가 사용되면 성능에 어떤 영향이 있는지 궁금합니다. – axel22

1

Thread.currentThread().getStackTrace()의 문제점은 무엇입니까? 여기에 poiinted : stack overflow comment

+1

이것은 스택에 변수를 포함하지 않습니다. –

+0

이것은 디버깅 목적에 더 적합합니다. 소스 코드 행과 클래스의 이름과 호출되는 클래스의 메서드 이름을 반환하기 때문에 디버깅 목적에 더 적합합니다. 스택 프레임. – axel22

1

체크 아웃 페이지 : 자바 과정에서 자바를 얻을 수 있습니다

이 유틸리티 및 기본 스택 정보 : http://download.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/tools.html

을 그들은 나와 jstack을 유틸리티를 가지고있다. Solaris OS 및 Linux의 경우 유틸리티는 코어 파일 또는 원격 디버그 서버에서도 정보를 가져올 수 있습니다. 2.11 jstack 유틸리티를 참조하십시오.

나는 그것을 사용한 적이 없지만 jdk와 함께 제공되는 Visual VM 도구를 사용했습니다.

HTH, 제임스