Не удается включить датчики DTrace через jinfo в Mac OS X - PullRequest
4 голосов
/ 04 февраля 2011

Запуск 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 Ответ

3 голосов
/ 08 сентября 2011

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

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

...