Что такое BTrace?
BTrace — проект с открытым исходным кодом, который был запущен в 2007 году и изначально принадлежал двум людям — А.Сундарараджану и К.Баласубраманяну. Он получил известность благодаря конференции Java One 2008.
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». Я могу написать о некоторых из этих полей в будущем.