Не удается включить зонды 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 );
        }
    }
}

person Mark Bennett    schedule 03.02.2011    source источник
comment
Этот вопрос получил перекати-поле. :-( Многие разработчики используют Mac, поэтому я удивлен, что никто больше этого не видел? Или, может быть, у вас у всех такая же проблема и вы тоже ждете ответа? Хм... ну, если у вас было проблема, пожалуйста, по крайней мере, прокомментируйте!   -  person Mark Bennett    schedule 27.02.2011


Ответы (1)


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

Это почти наверняка (давняя) ошибка в Hotspot JVM, а не уникальная для OSX. Вот отчет от человека, которому не удалось установить флаги виртуальной машины через 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, которая сильно устарела и/или неточна, я подозреваю, что, несмотря на документацию/справочную страницу для jinfo, а также документацию по самим зондам (http: //download.oracle.com/javase/6/docs/technotes/guides/vm/dtrace.html), что указывает на то, что некоторые детали реализации в Hotspot изменились, чтобы сделать динамическую установку этого флага либо невозможной, либо настолько непрактичной, что был отключен. Другими словами, это ошибка, которая не будет исправлена.

person vanaltj    schedule 07.09.2011