Статьи

Введение в BTrace

 

Цель этой статьи — узнать, как динамически отслеживать / наблюдать запущенные приложения Java (JDK 6+) с использованием BTrace без изменения кода и параметров конфигурации приложений.


Что такое BTrace?

BTrace — проект с открытым исходным кодом, который был запущен в 2007 году и изначально принадлежал двум людям — А.Сундарараджану и К.Баласубраманяну. Он получил известность благодаря конференции Java One 2008.

BTrace помогает нам точно определять сложные проблемы кода в приложении. Проблемы, которые могут быть решены с помощью BTrace, включают в себя ошибки кода, непредсказуемые потоки, проблемы параллелизма и проблемы производительности, которые возникают при определенных и обычно трудно воспроизводимых обстоятельствах. 

BTrace динамически (без перезапуска приложения) обрабатывает (изменяет) байт-код приложения так, как это определяет программист. Цель инструментария — увидеть, что происходит в конкретной области кода. При использовании вне этой области это может повредить потоку приложений и поэтому запрещено валидатором.

Например, давайте попробуем решить следующую проблему — важный файл иногда удаляется один раз в день. Мы хотим найти код, который делает это. Поэтому мы хотели бы изменить метод «delete» файла java.io.File и распечатать трассировку стека вызывающего потока, если имя файла подходит. С BTrace мы можем сделать это, написав короткий и простой Java-код.


Следующая схема отображает принципы работы BTrace.

В Target JVM есть динамически вставленный агент BTrace (с помощью
API присоединения ). Клиент BTrace (либо BTrace Command Line, либо Visual VM с плагином BTrace) отправляет команды агенту и получает ответы. Классы инструментов агента BTrace, которые загружаются в целевую JVM и перезагружают уже загруженные классы.

Написание сценария трассировки


Написание сценариев BTrace довольно простое и понятное и имеет концепции, сходные с концепциями Аспектно-ориентированного программирования.

 

import com.sun.btrace.annotations.*;
import com.sun.btrace.BTraceUtils;

@BTrace
public class HelloWorld {

@OnMethod(clazz="java.io.File",method="<init>")
public static void onNewFileCreated(String fileName) {
   BTraceUtils.println("New file is being created");
   BTraceUtils.println(fileName);
}


Каждый скрипт BTrace состоит из зондов (pointcut в сленге аспектов) и Actions (советы).
Зонд определяет, когда инструменты должны быть выполнены. Действие определяет инструментарий.


Зонд может состоять из следующего:
  • Метод входа / выхода
  • Номер строки
  • Поле обновлено / доступно
  • Вызов / возврат метода (в пределах указанных методов)
  • Исключительный бросок (до)
  • Синхронизация входа / выхода
  • таймер
  • Запись конструктора

 Возможности и ограничения BTrace


способности

  • Динамически подключайтесь к любому приложению java6 + и запускайте любой (*) код

Ограничения

  • Должен работать с тем же пользователем, с которым работает отслеживаемое приложение — из-за проблем безопасности
  • Поддерживает только Hotspot JVM
  • Компилируется отдельно от целевого приложения — не знаком с классами приложения
  • Может разрушить целевое приложение — я запустил BTrace на нашей установке долголетия, которая была сильно загружена многими сценариями трассировки. Целевое приложение не сломалось ни разу.

Продвинутый BTrace

Сообщество BTrace де-факто состоит из одного разработчика, который регулярно работает над проектом. Поэтому не ожидайте слишком большого улучшения и множества новых функций в следующих выпусках. (Это хорошая возможность внести свой вклад в проект, поскольку каждый разработчик значительно улучшит разработку).

Документация проекта должна быть значительно улучшена — я обнаружил, что много раз догадывался об интеграции этой структуры в существующие структуры на моей работе. Форум BTrace — хороший способ получить ответы о фреймворке.

Чтобы понять, как работает магия BTrace, необходимы знания в трех областях — «Разработка агентов Java», «Работа с байт-кодом в Java» и «Java attach api». Я могу написать о некоторых из этих полей в будущем.

Рекомендации

Проверьте мой блог

http://www.parleys.com/#st=5&id=1618&sl=1

http://kenai.com/projects/btrace