我正在编写一个 Java 代理来与 JVMTI 交互。由于我不会进入的原因,我需要使用 JVMTI(java
进程内的 C 接口)而不是 Java APIjava.lang.instrument
或 JDI。我希望能够做一些似乎不受直接支持的事情。
- 有没有办法在 Java 进程已经启动后加载代理?
- 有没有办法从 JVMTI 代码内部或进程外部卸载 Java 代理(没有杀死整个 Java 进程)?例如,
dlclose()
如果我能找到动态加载模块的句柄,我是否可以安全地从 JVMTI 代码调用?
如果无法完成这些操作,有没有办法在加载数据后将数据传递给 Java 代理?是否有通过一些 Java 命令行实用程序执行此操作的正常方法?如果没有,我可以安全地创建一个线程并让它在我的代理代码中使用标准 C 或 C++ 库调用来监听套接字吗?
如果有帮助,请不要担心您的答案是否支持 Windows - 我正在开展这个项目以扩展仅适用于 Unix 的调试工具。
注意:我已经看到了这一点,但认为可能有一些正常的方法可以做到这一点,但 JVMTI 标准中没有。