2016-10-18 2 views
6

特定のクラスのインスタンスで特定のメソッドを呼び出すことによってプロセスを停止する必要があります。このプロセスは1日実行されています。私がそれを厳重に停止すると、私は多くの作業を失います。 APIの不具合により、GUIが誤って配線され、正しい停止機能が呼び出されません。インタラクティブなJava(Scala)インタプリタが付属しているので、プロセスのインスタンスを取得できれば、簡単に正しいメソッドを呼び出すことができます。JVM - 実行中の(計測されていない)セッションでクラスのインスタンスを取得する

私はデバッグセッションに参加していません。com.sun.jdiはありません。私はスタックトレースダンプでインスタンスを見ることができますが、StackTraceElementには実際のインスタンス、クラス、行番号だけが含まれていません。

実行中のセッションで、特定の計測器を使用せずに、そのインスタンスをスレッドのダンプを介して保持する方法はありますか?

+0

AFAIKを受けていない。 –

+0

[Attach API](http://docs.oracle.com/javase/8/docs/technotes/guides/attach/)を使用すると、実行中の仮想マシンにエージェントを強制的にロードできます同じマシン。 JVMがこれをサポートしていない場合、チャンスは低いです... – Holger

+0

@Holgerありがとう、面白そうです。私はHotSpotにいるので、動作すると思います。あなたは "example attachment"へのポインタを持っていますか? –

答えて

2

JVMTI IterateOverInstancesOfClass機能を使用して、指定されたクラスのすべてのインスタンスを取得することができます。 this answerの例を参照してください。

上記の関数を使用して必要なインスタンスを見つけ出し、JNI_OnLoadエントリからメソッドを呼び出すJNIライブラリを作成します。次に、インタプリタ・コンソールからSystem.loadを呼び出して、このライブラリーをロードします。

関連する問題