【问题标题】:java agent with jvmti load at runtime, unload from withinjava代理在运行时加载jvmti,从内部卸载
【发布时间】:2013-06-26 23:02:51
【问题描述】:

我正在编写一个 Java 代理来与 JVMTI 交互。由于我不会深入探讨的原因,我需要使用 JVMTI(java 进程内的 C 接口)而不是像 java.lang.instrument 或 JDI 这样的 Java API。我希望能够做一些似乎不受直接支持的事情。

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

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

如果有帮助,请不要担心您的答案是否支持 Windows - 我正在开展这个项目以扩展仅适用于 Unix 的调试工具。

注意:我已经看过this,但认为可能有一些正常的方法可以做到这一点,但JVMTI 标准中没有。

【问题讨论】:

    标签: java debugging dlopen dynamic-loading jvmti


    【解决方案1】:
    1. 您只能通过传递参数-agentlib:<agent-lib-name>=<options> 或-agentpath:<path-to-agent>=<options> 在JVM 的start time 注入(部署)代理。

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

    2. 我不确定,类似于 1。您可以通过字节码检测运行 Java unload 方法。如果dlclose() 有效,我认为这样做没有问题。

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

    【讨论】:

      猜你喜欢
      • 2011-09-01
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 2012-01-23
      • 2015-09-29
      相关资源
      最近更新 更多