Не удается подключиться к JVM с помощью jdk 1.5

У меня есть java-приложение, которое должно работать с jdk 1.5. Мне нужен способ подключиться к этому приложению JVM, используя его PID. Я попробовал библиотеку ByteBuddy, но при попытке загрузить агент выдает следующую ошибку.

Exception in thread "main" java.lang.IllegalStateException: Target could not dispatch command successfully
at net.bytebuddy.agent.VirtualMachine$ForHotSpot$Connection$ForJnaWindowsNamedPipe.execute(VirtualMachine.java:1043)
at net.bytebuddy.agent.VirtualMachine$ForHotSpot.load(VirtualMachine.java:361)
at net.bytebuddy.agent.VirtualMachine$ForHotSpot.loadAgent(VirtualMachine.java:335)
at main.Agent.main(Agent.java:28)

Вот код в основном методе:

public static void main(String[] args) {
    try {
        VirtualMachine vm = VirtualMachine.ForHotSpot.attach("19708");
        vm.loadAgent("Agent.jar");
        vm.detach();
    } catch (IOException e) {
        System.out.println(e.getMessage());
    }
}

Может ли кто-нибудь помочь мне с этой проблемой?


person salsabeel salah    schedule 24.08.2020    source источник
comment
Пожалуйста, используйте e.printStackStrace() вместо e.getMessage(). Message возвращает только последнюю подсказку, тогда как основная причина может быть в полной трассировке стека.   -  person Izbassar Tolegen    schedule 24.08.2020
comment
По-прежнему дает мне то же исключение без каких-либо подробностей.   -  person salsabeel salah    schedule 25.08.2020


Ответы (2)


API Attach был представлен в JDK 6. Вы найдете его в пакете com.sun.tools.attach, который недоступен в JDK 5. Также соответствующая библиотека jre/lib/.../libattach.so (UNIX-подобная ОС) или jre/bin/attach.dll (Windows) недоступна в вашей папке JDK, если вы хотите сравнить JDK 5 с 6+. Следовательно, вы не можете подключить агент в горячем режиме к виртуальной машине Java 5 с помощью этого метода. Возможно, вы могли бы запустить свое приложение Java 5 на виртуальной машине Java 6+, а затем подключиться к ней.

P.S.: Вам не нужен ByteBuddy для горячего подключения агента, см. это руководство :

import com.sun.tools.attach.AgentInitializationException;
import com.sun.tools.attach.AgentLoadException;
import com.sun.tools.attach.AttachNotSupportedException;
import com.sun.tools.attach.VirtualMachine;

import java.io.File;
import java.io.IOException;

class Scratch {
  public static void main(String[] args) throws IOException, AttachNotSupportedException, AgentLoadException, AgentInitializationException {
    VirtualMachine jvm = VirtualMachine.attach("22384");
    jvm.loadAgent(new File("foo.jar").getAbsolutePath());
    jvm.detach();
  }
}

При выполнении этого против программы, работающей на виртуальной машине Java 5, вы также увидите более конкретное сообщение об ошибке:

Exception in thread "main" com.sun.tools.attach.AttachNotSupportedException: The VM does not support the attach mechanism
    at sun.tools.attach.HotSpotAttachProvider.testAttachable(HotSpotAttachProvider.java:162)
    at sun.tools.attach.WindowsAttachProvider.attachVirtualMachine(WindowsAttachProvider.java:67)
    at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:208)
    at Scratch.main(scratch.java:11)
person kriegaex    schedule 25.08.2020
comment
Да, я пробовал это раньше и получил эту ошибку. Проблема здесь в том, что приложение не работает должным образом на jdk 6. некоторые элементы выдают ошибки, поскольку я предполагаю, что их нет в jdk 6. - person salsabeel salah; 25.08.2020
comment
Возможно, это стоило бы исследовать дальше. JDK 6 должен быть обратно совместим с JDK 5. Есть ли шанс, что вы сможете создать новый вопрос и опубликовать полученные ошибки? Возможно, это несовместимость с JDK, но, скорее всего, у вас проблемы с конфигурацией. Кроме того, как насчет перекомпиляции исходного кода на более поздней версии JDK 6+? Если бы вы могли поделиться исходным кодом (возможно, на GitHub) для этого старого проекта в своем новом вопросе, это помогло бы другим исследовать вашу проблему. Не стесняйтесь также размещать ссылку на новый вопрос здесь. - person kriegaex; 25.08.2020
comment
Спасибо @kriegaex. К сожалению приложение не мое. Я свяжусь с вендором, чтобы уточнить у него возможность перекомпилировать код с jdk 6+. - person salsabeel salah; 25.08.2020
comment
Если поставщик отказывается сделать это за вас, то в зависимости от того, какой тип агента вы хотите использовать и насколько статической или динамической должна быть встроенная функциональность, другим обходным путем может быть статическое сплетение исходного байтового кода и создание нового JAR. (или любой другой архив) версии указанного приложения, заменяющие оригиналы. Для инструментов инструментирования, таких как ByteBuddy и ASM, существуют плагины Maven (для BB также Gradle), которые могут позаботиться об инструментарии во время сборки за вас. - person kriegaex; 25.08.2020

Из трассировки стека я вижу, что вы используете VirtualMachine$ForHotSpot$Connection$ForJnaWindowsNamedPipe. Это означает, что Byte Buddy эмулирует для вас вложение с помощью JNA. Хотя это возможно в Java 5, которая не предлагает поставщика вложений, целевая виртуальная машина должна быть как минимум версии 6, в которой было введено динамическое вложение для отправки команды на вложение.

Невозможно подключиться к виртуальной машине версии 5, только с одной, если доступна JNA.

person Rafael Winterhalter    schedule 25.08.2020