Java 如何以编程方式挂起当前JVM并等待调试器连接?

Java 如何以编程方式挂起当前JVM并等待调试器连接?,java,jvm,jvmti,jdi,jdwp,Java,Jvm,Jvmti,Jdi,Jdwp,我的目标是用Java实现一个小型库,它允许以编程方式执行一些操作,然后挂起当前JVM,直到调试器连接到它 我认为至少有一部分是可能的,例如,当在调试模式下用suspend=y启动JVM时,它将等待调试器连接。是否有人有指向实现此功能的代码的指针 JVMTI似乎可以让我以编程的方式做类似的事情,但我想知道是否有更高级别的API,或者是否有人提供了关于如何从Java与JVMTI交互的代码示例/解释(我的假设是JVMTI中的代理将能够挂起JVM,但我需要从Java代码调用它) 更新: 这是我到目前为止

我的目标是用Java实现一个小型库,它允许以编程方式执行一些操作,然后挂起当前JVM,直到调试器连接到它

我认为至少有一部分是可能的,例如,当在调试模式下用
suspend=y
启动JVM时,它将等待调试器连接。是否有人有指向实现此功能的代码的指针

JVMTI似乎可以让我以编程的方式做类似的事情,但我想知道是否有更高级别的API,或者是否有人提供了关于如何从Java与JVMTI交互的代码示例/解释(我的假设是JVMTI中的代理将能够挂起JVM,但我需要从Java代码调用它)

更新: 这是我到目前为止发现的

1) 通过使用JNI函数从Java调用JVMTI代码相对简单,JNI函数随后将使用JVMTI环境。诀窍是在加载代理时保留对jvmtienv的引用。这篇博文很有帮助

2) 可以在启动时传递给JVM并在恢复执行之前等待调试器连接的suspend选项的功能似乎不能重用。似乎只有调试器代理在该端口上侦听,一旦建立连接,它将继续执行/恢复线程


3) 为了让更高级别的API实现我想要的功能,普通线程.suspend()似乎可以实现我想要的功能。那么问题是它与SuspendThread有何不同。为此,我提出了另一个问题:.

经过一些实验,我能够通过JNI和JVMTI挂起线程。但是,现在我怀疑挂起功能是一种纯粹的临时功能,它可能会阻止当前线程在启动时运行代理,并等待调试器在打开的端口上连接,因此它与动态挂起线程无关。关于如何实现“等待调试器连接”部分的任何想法?看起来您已经找到了JVM TI和函数。他们为什么不为你工作?使用它们,你可以挂起除current之外的所有线程,并在当前线程中继续执行你想要的任何操作,例如,等待外部信号。哦,它们可以工作,我只是希望有一些内置机制,允许在将调试器连接到JVM时恢复操作。对,调试器只是另一个JVM TI代理。JVM不打开端口或等待连接——这是JDWP代理的工作。没有公共API可以知道是否附加了调试器。然而,有一种棘手的方法可能会有所帮助,例如,一旦调试器客户端连接,上面提到的“sun.jdwp.listenerAddress”属性就会被删除。在客户端断开连接后,它再次出现。经过一些实验,我能够通过JNI和JVMTI挂起线程。但是,现在我怀疑挂起功能是一种纯粹的临时功能,它可能会阻止当前线程在启动时运行代理,并等待调试器在打开的端口上连接,因此它与动态挂起线程无关。关于如何实现“等待调试器连接”部分的任何想法?看起来您已经找到了JVM TI和函数。他们为什么不为你工作?使用它们,你可以挂起除current之外的所有线程,并在当前线程中继续执行你想要的任何操作,例如,等待外部信号。哦,它们可以工作,我只是希望有一些内置机制,允许在将调试器连接到JVM时恢复操作。对,调试器只是另一个JVM TI代理。JVM不打开端口或等待连接——这是JDWP代理的工作。没有公共API可以知道是否附加了调试器。然而,有一种棘手的方法可能会有所帮助,例如,一旦调试器客户端连接,上面提到的“sun.jdwp.listenerAddress”属性就会被删除。它在客户端断开连接后再次出现。