Java プロセス内で、同じプロセスの JDI (Java Debugging Interface) にアクセスしたいと考えています。
私は次の仮定をします:
- プロセスはデバッガー内で実行されています (Intelli/J)
- Oracle JVM 8 を使用しています
- Linuxを実行しています(移植性は必要ありません)
つまり、私は次のようなことをしたいです:
import com.sun.jdi.*
import com.sun.jdi.connect.*
VirtualMachine vm = new SelfConnector().attach()
(もちろん、そのようなオブジェクトがないことを除いて。)
自分の VM に接続するにはどうすればよいですか?
なぜ私はそれが欲しいのですか?
一意の IDfindObj
を介してオブジェクトを検索する関数を作成したいと考えています。たとえば、Intelli/J デバッガーで変数 " " が表示された場合、オブジェクトを検索して返すウォッチ式 " " を追加できるようにしたいと考えています。そうすれば、変数が変更された後、または現在のスタック フレームを離れた後でも、オブジェクト #1234 を見ることができます。x = {Something@1234}
findObj(1234)
x
現在のプロセスの JDI にアクセスできるようになれば、この機能を実装できると思います。
[編集:質問には答えませんが、私のユースケースは解決します:Intellij/Jでは、オブジェクトを「マーク」し、これらのマーカーをウォッチ式で使用できます。]
私は何を試しましたか?
デバッグ セッションで Java プロセスを開始するときに Intelli/J が引数で指定するホスト名とポートを使用して、SocketAttach AttachingConnector経由でプロセス自体に接続しようとしました。(ここで-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:39469,suspend=y,server=n
説明されている方法に大まかに従っています。)私は得ます:
Exception in thread "main" java.net.ConnectException: Connection refused
おそらく、Intelli/J が既に接続されていて、そのポートに 2 回接続できないためでしょうか? [編集: Intellij/J はserver=n
、プロセスが接続を行うことを意味するパラメーターを使用して jwdp エージェントを開始します。したがって、接続は拒否されました。しかし、さらなる実験では、 を使用したとしてもserver=y
、せいぜい 1 つの接続しか受け入れられないことが示されています。]
別のアプローチは、 ProcessAttach AttachingConnectorを使用することでした。その場合、私は得ました:
Exception in thread "main" java.io.IOException: Not a debuggee, or not listening for debugger to attach