【问题标题】:JVMTI native agent (DLL) can not be loaded to a runing Java program - AgentLoadExceptionJVMTI 本机代理 (DLL) 无法加载到正在运行的 Java 程序 - AgentLoadException
【发布时间】:2013-06-18 02:52:09
【问题描述】:

我在这个问题上挣扎了几天,但还没有得到正确的答案。

问题描述如下: 我编写了一个普通的 Java 程序 (Program-A),并使用 Agent_OnLoad、Agent_OnAttach、Agent_OnUnload 方法编写了基于 Windows 的本机代理(*.dll,用 C/C++ 编写),如果使用 Java 命令行标志 (-agentlib)。然后我编写了另一个 Java 程序,将本机代理附加到正在运行的 Java Program-A 上(请参阅下面的 VM attach 和 loadAgentPath 代码片段),但是我得到了异常:

com.sun.tools.attach.AgentLoadException: Failed to load agent library

我试图以这种或那种方式更改 agentPath(绝对或相对文件路径),但这些都不起作用。我是否应该尝试其他方法来完成这项工作。我需要将本机代理附加到正在运行的 java 程序上,而不是使用命令行标志。

有没有人知道根本原因或解决办法的线索?

顺便说一句,运行附加VM Java代码的命令行为:

java -Djava.library.path=D:\DevTools\Java7\jre7\bin -classpath .;./tools.jar com.xxx.TestAgentVMAttacher 
...
VirtualMachine virtualMachine = com.sun.tools.attach.VirtualMachine.attach(pid); // Note: this code line is executed normally, I am sure the pid is correct
...
agentPath = theFilePath + "/myagent.dll"; // Note: I am sure the dll file path is correct 
virtualMachine.loadAgentPath(agentPath,null); // Note: this code line would cause the exception (AgentLoadException) as I mentioned above, no matter how I set the agentPath, even I set it as null, same exception happened.

环境相关信息:
- 操作系统:Windows XP - Java 版本:Java(TM) SE 运行时环境(内部版本 1.7.0-b147)

【问题讨论】:

    标签: native agent jvmti


    【解决方案1】:

    最终我找到了我的问题的答案,我在 Agent.cpp 文件中有一个错误的方法名称('Agent_Attach'),正确的应该是'Agent_OnAttach',通过这个修复,我的代理库(.dll)可以现在加载到正在运行的 Java 程序中。

    【讨论】:

      猜你喜欢
      • 2013-06-26
      • 2011-09-01
      • 1970-01-01
      • 2018-08-08
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多