在Java进程中,我想访问相同进程的JDI(Java调试接口)。
我做出以下假设:
也就是说,我想做类似的事情:
import com.sun.jdi.*
import com.sun.jdi.connect.*
VirtualMachine vm = new SelfConnector().attach()
(当然,除了没有这样的对象。)
如何连接到自己的VM?
我希望编写一个函数findObj
,通过unique ID找到一个对象。例如,如果在Intelli / J调试器中我看到变量“x = {Something@1234}
”,那么我希望能够添加一个查找并返回该对象的监视表达式“findObj(1234)
”。这样,即使在变量x
被更改或我离开当前堆栈帧之后,我也能够看到对象#1234。
我相信一旦我可以访问当前进程的JDI,我就可以实现这个功能。
[编辑:它没有回答这个问题,但它解决了我的用例:在Intellij / J中你可以"mark" objects,并在监视表达式中使用这些标记。]
我尝试在调试会话中启动Java进程时,使用Intelli / J在-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:39469,suspend=y,server=n
参数中提供的主机名和端口,通过SocketAttach AttachingConnector连接到进程本身。 (大致遵循here描述的方法。)我得到:
Exception in thread "main" java.net.ConnectException: Connection refused
可能是因为Intelli / J已连接且无法连接两次到该端口? [编辑:Intellij / J启动带参数server=n
的jwdp代理,这意味着进程将进行连接。因此连接被拒绝了。但进一步的实验表明,即使使用server=y
,也最多只接受一个连接。]
另一种方法是使用ProcessAttach AttachingConnector。在那种情况下,我得到了:
Exception in thread "main" java.io.IOException: Not a debuggee, or not listening for debugger to attach