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