AttachNotSupportedException из-за отсутствия файла java_pid в Attach API

Создавая собственный профилировщик, я использую JVMTI API для создания собственного агента библиотеки. Этот агент можно запустить вместе с JVM с помощью дополнительного параметра -agentlib. Кроме того, имеется API-интерфейс Attach , который позволяет внедрить агент в работающую JVM. Я хотел реализовать эту функцию в моем профилировщике, используя следующий код:

try {
    String pid = VirtualMachine.list().get(0).id();
    VirtualMachine vm = VirtualMachine.attach(pid);
    vm.loadAgentLibrary("agent");
} catch (AgentLoadException e1) {
    e1.printStackTrace();
} catch (AgentInitializationException e1) {
    e1.printStackTrace();
} catch (IOException e1) {
    e1.printStackTrace();
} catch (AttachNotSupportedException e) {
    e.printStackTrace();
}

Что он делает? Из всех доступных запущенных виртуальных машин ( VirtualMachine. list () ) Выбираю первый, присоединяюсь к нему и пытаюсь загрузить в него своего агента. Агент в системах UNIX с именем libagent.so может быть найден, но при попытке загрузить агент выдается следующее исключение:

com.sun.tools.attach.AttachNotSupportedException:
   Unable to open socket file:
      target process not responding or HotSpot VM not loaded.

При просмотре исходного кода возникает это исключение, поскольку он не может найти файл с именем .java_pid . Я не нашел много информации об этом виде файла в документации. Я часто слышал, что такие файлы больше не используются, но я использую Java 1.6.

Я также пытался подключиться к другим JVM, на самом деле я сохранил этот процесс подключения динамическим, по причинам тестирования я просто пытаюсь подключиться к любому JVM.


Это код, который приводит к исключению, взятому из sun.tools.attach: LinuxVirtualMachine.java :

    // Return the socket file for the given process.
    // Checks working directory of process for .java_pid. If not
    // found it looks in /tmp.
    private String findSocketFile(int pid) {
       // First check for a .java_pid file in the working directory
       // of the target process
       String fn = ".java_pid" + pid;
       String path = "/proc/" + pid + "/cwd/" + fn;
       File f = new File(path);
       if (!f.exists()) {
           // Not found, so try /tmp
           path = "/tmp/" + fn;
           f = new File(path);
           if (!f.exists()) {
               return null;            // not found
           }
       }
       return path;
   }

Он говорит: он ищет из корневого каталога / proc / . Глядя на набор изменений JDK7, кажется, что они вносят изменения в код Набор изменений JDK7 для LinuxVirtualMachine

12
задан Konrad Reiche 24 April 2011 в 10:14
поделиться