连接到自己的调试器接口的Java进程

时间:2016-08-07 20:22:45

标签: java jdi

在Java进程中,我想访问相同进程的JDI(Java调试接口)。

我做出以下假设:

  • 正在调试器中执行该过程(在Intelli / J中)
  • 我使用的是Oracle JVM 8
  • 我运行Linux(不需要携带)

也就是说,我想做类似的事情:

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

0 个答案:

没有答案