Systemtap для Java на Ubuntu

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

Соответственно, я установил репозиторий ddebs.ubuntu.com для установки символов отладки ядра - затем я могу вызвать сценарий stap, который использует тапсеты ядра, но еще не java. Я заметил пакет под названием openjdk-7-jdk-dbgsym и попытался установить его, чтобы увидеть, есть ли в нем тапсеты systemtap для openjdk, но это конфликтует с пакетом openjdk-7-dbg (который затем Ubuntu не позволяет мне отчет об ошибке, так как пакет openjdk-7-jdk-dbgsym не с «официальных» серверов.И если я удалю один и установлю другой, это все равно не поможет.

Кто-нибудь успешно сделал это на ubuntu?

редактировать: чтобы успешно собрать systemtap из исходного кода на Ubuntu с поддержкой java byteman, вам необходимо передать

--with-java=/usr/lib/jvm/default-java

(или ваше странное местоположение jvm)

Иначе строить не получится баночки и так нужные. Затем вам нужно выполнить make install, следуя инструкциям в исходном каталоге java/README (и не забудьте изменить путь).

Существует также еще одна опция --with-dyninst, которую я не пробовал, но мог бы «исправить» ее для других режимов вызова.

edit2: ну, он компилируется и даже запускается, но никогда ничего не выводит даже на приведенных примерах и с установленным BYTEMAN_HOME...


person i30817    schedule 02.03.2014    source источник


Ответы (2)


Существует несколько разных тактик для отслеживания openjdk от systemtap.

Первый основан на маркерах sys/sdt.h в стиле dtrace, скомпилированных в JVM, но не на данных dbgsym:

% stap -L 'process("/usr/lib/jvm/java*/jre/lib/*/server/libjvm.so").mark("*")'

Если это показывает пустой результат (и если у меня есть правильный путь ubuntu libjvm.so), то это говорит о том, что ваш openjdk был скомпилирован без материала sys/sdt.h, поэтому этот вариант закрыт для вас. Если он показывает прекрасный список, вы можете использовать эти зонды .mark напрямую или скопировать/адаптировать копию исходных кодов тапсета hotspot*.stp из любого места и транскрибировать ее в свой файл .stp, или позволить stap найти ее через

% stap -I PATH ...

Второй метод основан на отладочной информации dwarf, скомпилированной в JVM, для чего может пригодиться материал dbgsym*. Если это установлено правильно,

% stap -L 'process("/usr/lib/jvm/java*/jre/lib/*/server/libjvm.so").function("*")'

должен показать gajillion функций. Возможно, у вас не будет преимуществ тапсетов, но с умным выбором функций вы сможете получить достойную трассировку.

Третий метод основан на том, что byteman выполняет самоинструментирование внутри JVM под управлением systemtap. Это не требует java dbgsym, но требует byteman и кучу вспомогательного материала. Если это доступно и скомпилировано в systemtap ubuntu, то что-то вроде:

% stap -e 'probe java("org.my.MyApp").class("^java.lang.Object").method("foo(int)")
           { println($$parms) }'

может работать на вас.

person fche    schedule 02.03.2014
comment
К сожалению, ни один из них не работает на Ubuntu, даже жестко запрограммировав путь к /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server/libjvm.so, а также удалив openjdk-7-dbg и установив openjdk-7-jdk-dbgsym. Тем временем я открыл отчет об ошибке bugs.launchpad.net/ubuntu/ +источник/openjdk-7/+ошибка/1286895 - person i30817; 03.03.2014
comment
Ну, на самом деле я еще не пробовал метод byteman, но я уже посмотрел на него и не смог найти требуемые пакеты / .so. - person i30817; 03.03.2014
comment
Я имею в виду файлы libHelperSDT_*.so и HelperSDT.jar, упомянутые в подкаталоге java systemtap git. Их нигде не видно после постройки. - person i30817; 03.03.2014
comment
Проклятие. В Fedora каталог java по умолчанию называется не так, как обычно: /usr/lib/jvm/java; ubuntu /usr/lib/jvm/default-java, если у вас установлена ​​стандартная java, чего я по какой-то причине не сделал. Итак, вам нужно построить, например: ./configure --prefix=/home/i30817/systemtap --with-java=/usr/lib/jvm/default-java - person i30817; 03.03.2014

В итоге я использовал byteman непосредственно для java и systemtap для ядра. Громоздкий, но работает.

person i30817    schedule 07.03.2014