При подключении VirtualMachine генерируется com.sun.tools.attach.AgentLoadException: 0 при использовании Open JDK 10.0.2.

Я сталкиваюсь с проблемой при использовании com.sun.tools.attach.VirtualMachineJava API. Мое целевое приложение (Tomcat) работает с использованием Oracle Hot Spot версии 1.7.0_80. Я пытаюсь подключить этот tomcat через динамическое присоединение из другой программы Java (на той же машине), которая использует Open JDK 10.0.2. Я использую код ниже

...............
String agentPath = Agent.class.getProtectionDomain().getCodeSource().getLocation().getPath();
agentPath = convertFileSeparators(agentPath, File.separatorChar);
String agentInstallDir = agentPath.substring(0, agentPath.lastIndexOf(File.separator));
System.out.println("My Java agent installed on the location :"+agentPath);
StringBuilder sb = new StringBuilder();
sb.append("MY_RELIC_HOME").append("=").append(agentInstallDir);
if (agentArgs != null) {
     sb.append(",").append(agentArgs);
}
com.sun.tools.attach.VirtualMachine virtualMachine =  com.sun.tools.attach.VirtualMachine.attach(vmID);
virtualMachine.loadAgent(agentPath, sb.toString());
.........

Я могу успешно подключиться к целевому приложению, но получаю приведенное ниже исключение в моей программе присоединения (работает open JDK 10.0.2) после присоединения.

com.sun.tools.attach.AgentLoadException: 0
    at jdk.attach/sun.tools.attach.HotSpotVirtualMachine.loadAgentLibrary(HotSpotVirtualMachine.java:104)
    at jdk.attach/sun.tools.attach.HotSpotVirtualMachine.loadAgentLibrary(HotSpotVirtualMachine.java:115)
    at jdk.attach/sun.tools.attach.HotSpotVirtualMachine.loadAgent(HotSpotVirtualMachine.java:139)
    at com.eg.agent.Agent.main(Agent.java:582)

Код в строке № 582 virtualMachine.loadAgent(agentPath, sb.toString());,

Если я запускаю свою программу присоединения с использованием Java 7 или 8, исключений нет, и присоединение является успешным.

Зачем com.sun.tools.attach.AgentLoadException: 0 Возникает ли исключение при использовании JDK 10?

1 ответ

Нашел проблему, посмотрев исходный код sun.tools.attach.HotSpotVirtualMachine в обеих версиях java 10 и 8. Метод loadAgentLibrary(...) полностью отличается между 10 и 8.

Ниже приведен код от 1.8, который показывает, что значение result ноль означает, что VMAttach является успехом.

private void loadAgentLibrary(String agentLibrary, boolean isAbsolute, String options)
    throws AgentLoadException, AgentInitializationException, IOException
{
    InputStream in = execute("load",
                             agentLibrary,
                             isAbsolute ? "true" : "false",
                             options);
    try {
        int result = readInt(in);
        if (result != 0) {
            throw new AgentInitializationException("Agent_OnAttach failed", result);
        }
    } finally {
        in.close();

    }
}

Ниже приведен код из Java 10 в VM Attach является успехом, когда значение result является "return code: 0" (но в 1.8 это просто 0).

private void loadAgentLibrary(String agentLibrary, boolean isAbsolute, String options) 
    throws AgentLoadException, AgentInitializationException, IOException 
{ 
    String msgPrefix = "return code: "; 
    InputStream in = execute("load", 
                             agentLibrary, 
                             isAbsolute ? "true" : "false", 
                             options); 
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(in))) { 
        String result = reader.readLine(); 
        if (result == null) { 
            throw new AgentLoadException("Target VM did not respond"); 
        } else if (result.startsWith(msgPrefix)) { 
            int retCode = Integer.parseInt(result.substring(msgPrefix.length())); 
            if (retCode != 0) { 
                throw new AgentInitializationException("Agent_OnAttach failed", retCode); 
            } 
        } else { 
            throw new AgentLoadException(result); 
        } 
    } 
} 

В моем случае код Java 7/8 (Target Application) возвращает result как 0(что означает, что VM Attach является успешным) для кода Java 10 (код VM Attach), который ожидает, что результат должен быть "return code: 0"

Другие вопросы по тегам