2013-06-29 49 views
4

我正在写一个Java代理与JVMTI进行交互。由于我不会涉及的原因,我需要使用JVMTI(java进程中的C接口),而不是像java.lang.instrument或JDI这样的Java API。我希望能够做一些似乎不被直接支持的事情。Java代理与jvmti在运行时加载,从内部卸载

  1. 有没有办法在Java进程启动后加载代理?
  2. 有没有办法从JVMTI代码内部或从进程外部卸载Java代理(不会杀死整个Java进程)?例如,如果我能找到动态加载模块的句柄,我可以从JVMTI代码中安全地调用dlclose()吗?

如果这些操作无法完成,有没有办法在加载后将数据传递给Java代理?有没有通过一些Java命令行实用程序来完成此操作的正常方法?如果没有,我可以安全地创建一个线程并使用代理中的标准C或C++库调用来监听套接字吗?

如果有帮助,不用担心支持Windows与你的答案 - 我从事这个项目扩展仅限Unix调试工具。

说明:我已经看过this但认为可能有一些正常的方式来做到这一点,它不是JVMTI标准。

回答

4
  1. 只能通过将参数-agentlib:<agent-lib-name>=<options>-agentpath:<path-to-agent>=<options>注入(部署)的试剂或者在JVM的start time

    另一种方式是通过Java本身。这在很大程度上取决于JVM,因此它超出JVMTI规范范围。例如,如果通过方法loadAgentPath(agentPath, options)VirtualMachine类。如果您想从本机JVMTI代码中执行此操作,则需要执行字节码检测。

  2. 我不确定,与1相似,您可以通过Bytecode工具运行Java unload方法。如果dlclose()工作,我没有看到这样做的问题。

如您所见,可以使用选项将数据传递给Java代理。或者,如果您想在两个实例之间连续传递数据,则可以打开两个套接字并在它们之间进行写入/读取。我用Protobuf