デバッガを使用せずにJVM上の現在のスコープ内のローカル変数のマップまたは他のデータ構造を取得する方法はありますか?つまり、現在のスタックフレームのローカルを取得しますか?JVM上のスタックフレームからローカル変数を取得する
私はstacktraceオブジェクトがあることを知っていますが、StackTraceElement
にはどのような状態にもアクセスできません。どのメソッドがどこに呼び出されたのかがわかりますが、そのメソッドはどこにあるのかはわかりません。
デバッガを使用せずにJVM上の現在のスコープ内のローカル変数のマップまたは他のデータ構造を取得する方法はありますか?つまり、現在のスタックフレームのローカルを取得しますか?JVM上のスタックフレームからローカル変数を取得する
私はstacktraceオブジェクトがあることを知っていますが、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 –