디버거를 사용하지 않고 JVM에서 현재 범위의 로컬 변수의 맵 또는 다른 데이터 구조를 가져 오는 방법이 있습니까? 즉, 현재 스택 프레임의 로컬을 가져 오려면?JVM의 스택 프레임에서 로컬 변수 가져 오기
스택 트레이스 객체가 있다는 것을 알고 있지만 StackTraceElement
에는 어떤 상태로든 액세스 할 수있는 방법이 없습니다. 어떤 메소드가 어디서 호출되었는지 알려주지 만 그 안에 무엇이 있는지는 알려주지 않습니다.
디버거를 사용하지 않고 JVM에서 현재 범위의 로컬 변수의 맵 또는 다른 데이터 구조를 가져 오는 방법이 있습니까? 즉, 현재 스택 프레임의 로컬을 가져 오려면?JVM의 스택 프레임에서 로컬 변수 가져 오기
스택 트레이스 객체가 있다는 것을 알고 있지만 StackTraceElement
에는 어떤 상태로든 액세스 할 수있는 방법이 없습니다. 어떤 메소드가 어디서 호출되었는지 알려주지 만 그 안에 무엇이 있는지는 알려주지 않습니다.
디버거를 지원하기 위해 변수 이름을 클래스 파일에 포함 할 수 있지만 javac
은 기본적으로이 이름을 사용하지 않습니다. -g:vars
옵션이 필요합니다.
프로그램이있는 경우 ASM과 같은 바이트 코드 엔지니어링 라이브러리를 사용하여 로컬 변수 이름과 범위에 액세스 할 수 있습니다.
this question은 잘못 표현되어 있지만 중복 된 것으로 생각되며 답변은 문제와 관련이있을 수 있습니다. 나는 이름에 신경 쓰지 않는다면 지역 변수 유형과 범위가 각 메소드의 속성 테이블에 항상 포함된다는 것을 추가 할 것이다.
나는 이것을 할 방법이 없다고 생각합니다. 컴파일러는 항상 로컬 변수를 최적화 할 수 있으며 컴파일러가 이러한 유형의 최적화를 활용하지 못하게합니다. 메소드를 컴파일 할 때, 컴파일러는 프로그램에서 가상의 getLocalVariables()
을 다른 곳으로 호출했는지 여부를 알 수 없으므로 항상 선언 된 모든 지역 변수를 해당 맵에 넣어야합니다.
로컬 변수는 StackFrame의 맵에서 사용할 수 있습니다. 여기에서 살펴볼 수 있습니다. https://docs.oracle.com/javase/7/docs/jdk/api/jpda/jdi/com/sun/jdi/StackFrame.html –