我的目标是用Java实现一个小型库,该库允许以编程方式执行一些操作,然后挂起当前的JVM,直到将调试器连接到它。
例如,我想至少有一部分是可能的。使用suspend=y
以调试模式启动JVM时,它将等待调试器连接。没有人有实现该功能的代码的指针吗?
似乎JVMTI可能使我能够以编程方式执行类似的操作,但是我想知道是否存在更高级别的API,或者是否有人有关于如何与Java进行JVMTI交互的代码示例/说明(我的假设是JVMTI中的代理将能够挂起JVM,但我需要从Java代码中调用它。
更新: 这是我到目前为止所发现的。
1)通过具有JNI函数(然后使用jvmti env)从Java调用JVMTI代码是相对简单的。诀窍是在代理加载期间保留对jvmtienv的引用。这篇博客文章https://www.javacodegeeks.com/2014/12/own-your-heap-iterate-class-instances-with-jvmti.html很有帮助。
2)可以在启动时传递给JVM并等待调试器在恢复执行之前连接的suspend选项的功能似乎无法重用。似乎可能只是侦听此端口的调试器代理,一旦建立连接,它将继续执行/恢复线程。
3)为使更高级别的API实现我想要的功能,似乎普通thread.suspend()可能会实现我想要的功能。然后的问题是,它与SuspendThread有何不同。我为此打开了另一个问题:What is the difference between JVMTI SuspendThread and Javas thread.suspend?。