-1

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

这里是问题描述:我写了一个普通的Java程序(Program-A),写了一个基于Windows的原生代理(*.dll,用C/C++编写),使用Agent_OnLoad、Agent_OnAttach、Agent_OnUnload方法,如果使用它可以正常工作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)

4

1 回答 1

0

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

于 2013-07-02T04:14:12.177 回答