Не удается включить датчики DTrace через jinfo в Mac OS X

Запуск Java 6 на Snow Leopard.

Вы должны иметь возможность включать ExtendedDTraceProbes в работающий процесс Java с помощью утилиты jinfo. Даже в моей командной строке jinfo говорит о включении общих флагов:

Usage:
    jinfo [option] <pid>
        (to connect to running process)
...
where <option> is one of:
    -flag [+|-]<name>    to enable or disable the named VM flag

И, насколько я знаю, флаги DTrace не имеют какого-либо особого значения, имеет значение только их наличие или отсутствие.

Но когда я пытаюсь сделать это, я получаю одну из двух ошибок, в зависимости от того, буду ли я предваряю это sudo или нет.

Предполагая, что:
JPS

1234 StayRunning
...

Тот же пользователь, что и процесс StayRunning:
jinfo -flag + ExtendedDTraceProbes 1234

Exception in thread "main" java.io.IOException: Command failed in target VM
at sun.tools.attach.MacosxVirtualMachine.execute(MacosxVirtualMachine.java:200)
at sun.tools.attach.HotSpotVirtualMachine.executeCommand(HotSpotVirtualMachine.java:195)
at sun.tools.attach.HotSpotVirtualMachine.setFlag(HotSpotVirtualMachine.java:172)
at sun.tools.jinfo.JInfo.flag(JInfo.java:111)
at sun.tools.jinfo.JInfo.main(JInfo.java:58)

Попытка от имени root:
sudo jinfo -flag + ExtendedDTraceProbes 1234

Password: (which I enter)
1234: Unable to open socket file: target process not responding or HotSpot VM not loaded

Ошибка находится на второй строке, и, конечно, процесс все еще работает.

Как ни странно, эта страница не показывает опцию "+" для OS X, но мой собственный компьютер распечатывает сообщение об использовании.

Вот мой простой код. Это не так с Eclipse.

StayRunning.java

class StayRunning {
    public static void main( String [] args ) throws Exception {
        long counter = 0L;
        while( true ) {
            Thread.sleep( 1000 );
            counter++;
            System.out.println( "tick "+counter );
        }
    }
}

1 ответ

Решение

Вы правы в том, что этот зонд может быть либо "установлен", либо "не установлен" (т. Е. С ним не связано никакое конкретное "значение").

Это почти наверняка (давняя) ошибка в JVM Hotspot, и она не уникальна для OSX. Вот отчет от кого-то, кто не может установить флаги VM через jinfo в Windows:

http://www.herongyang.com/Java-Tools/jstack-jinfo-Change-HotSpot-VM-Option.html

Я могу лично убедиться, что не могу установить ExtendedDTraceProbes и (для науки!) Несколько других флагов динамически через jinfo в Linux. Фактически, после нескольких попыток я не смог найти флаг, который мог бы установить динамически.

Я столкнулся с соответствующей ошибкой в ​​Sun / Oracle:

http://bugs.sun.com/view_bug.do;jsessionid=24c1d7e1b0cda2ffffffff97aef6bbd818cf2?bug_id=6445836

Что самое интересное, в разделе "Оценка": "jinfo -flag - это временное решение для динамического включения зондов DTrace. Как сказала Мэнди, это должно исчезнуть".

Основываясь на этом, а также на моем прошлом опыте документирования Hotspot, который сильно устарел и / или неточен, я подозреваю, что, несмотря на документацию / man-страницу для jinfo, а также документацию для самих зондов (http: //download.oracle.com/javase/6/docs/technotes/guides/vm/dtrace.html) указывающий в противном случае, что некоторые детали реализации в Hotspot были изменены, чтобы сделать динамическую настройку этого флага либо невозможной, либо настолько непрактичной, что был отключен. Другими словами, это ошибка, которая не будет исправлена.

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