2009-08-31 3 views
8

디버거를 사용하지 않고 JVM에서 현재 범위의 로컬 변수의 맵 또는 다른 데이터 구조를 가져 오는 방법이 있습니까? 즉, 현재 스택 프레임의 로컬을 가져 오려면?JVM의 스택 프레임에서 로컬 변수 가져 오기

스택 트레이스 객체가 있다는 것을 알고 있지만 StackTraceElement에는 어떤 상태로든 액세스 할 수있는 방법이 없습니다. 어떤 메소드가 어디서 호출되었는지 알려주지 만 그 안에 무엇이 있는지는 알려주지 않습니다.

답변

4

디버거를 지원하기 위해 변수 이름을 클래스 파일에 포함 할 수 있지만 javac은 기본적으로이 이름을 사용하지 않습니다. -g:vars 옵션이 필요합니다.

프로그램이있는 경우 ASM과 같은 바이트 코드 엔지니어링 라이브러리를 사용하여 로컬 변수 이름과 범위에 액세스 할 수 있습니다.

this question은 잘못 표현되어 있지만 중복 된 것으로 생각되며 답변은 문제와 관련이있을 수 있습니다. 나는 이름에 신경 쓰지 않는다면 지역 변수 유형과 범위가 각 메소드의 속성 테이블에 항상 포함된다는 것을 추가 할 것이다.

1

나는 이것을 할 방법이 없다고 생각합니다. 컴파일러는 항상 로컬 변수를 최적화 할 수 있으며 컴파일러가 이러한 유형의 최적화를 활용하지 못하게합니다. 메소드를 컴파일 할 때, 컴파일러는 프로그램에서 가상의 getLocalVariables()을 다른 곳으로 호출했는지 여부를 알 수 없으므로 항상 선언 된 모든 지역 변수를 해당 맵에 넣어야합니다.

+0

로컬 변수는 StackFrame의 맵에서 사용할 수 있습니다. 여기에서 살펴볼 수 있습니다. https://docs.oracle.com/javase/7/docs/jdk/api/jpda/jdi/com/sun/jdi/StackFrame.html –