Data Race Detector
by Devexperts
Важно: Нам очень-очень важен любой фидбек по проекту, поэтому обо всех замечаниях, проблемах и пожеланиях, пожалуйста, пишите нам на drd-support@devexperts.com. Мы долго вели разработку и хотим понять насколько она для вас полезна, какие в ней недочеты и куда нам развиваться дальше.
Data Race Detector (DRD) - это утилита для динамического обнаружения гонок (data races) в Java-программе. DRD реализован в виде java agent-a, то есть он запускается в той же JVM, что и целевое приложение, и динамически ищет фактические и некоторые потенциальные гонки в приложении во время его работы. Результаты работы DRD выводятся в лог-файлы. По каждой обнаруженной гонке печатается информация, которая будет полезна для устранения гонки в коде исходной программы.
Статус: release 0.7
Delivery bundle представляет собой архив DRD-<version_number>.zip. Его нужно распаковать в какую-нибудь папку, которую далее по тексту мы назваем DRD_HOME_DIR.
В DRD_HOME_DIR находятся
После распаковки архива и переименовывания конфигурационных файлов DRD готов к использованию.
Прописать туда drd agent:
java -javaagent:DRD_HOME_DIR/drd_agent.jar -Ddrd.settings.file=<...> ...
если drd.setttings.file не указан, он по умолчанию ищется в DRD_HOME_DIR под именем drd.properties.
На данный момент в DRD нет интерактивного управляющего интерфейса - весь конфиг читается в момент старта и дальнейшие изменения в нем никак не отслеживаются (что позволяет перенести все проверки из runtime на этап инструментирования байт-кода). Если есть необходимость внести изменения в конфигурацию, то можно внести их и перезапустить программу. Например, можно изменить область поиска гонок, не искать гонки по определенным полям/методам или указать DRD необходимость хранить полные стектрейсы потоков при обращении к определенным полям.
DRD выделяет три области в коде: Race Detection Scope ≤ Synchronization Scope ≤ All Application Code
Если Race Detection Scope = Synchronization Scope = All Application Code, то приложение под DRD, скорее всего, не запустится из-за накладных расходов, поэтому разумно как-то сокращать количество информации, которую обрабатывает DRD во время работы программы.
Наша рекомендация по умолчанию: отслеживать операции синхронизации и искать гонки только в свое коде.
Итак, пусть Race Detection Scope < All Application Code. Код, который не попадает в race detection scope, будем называть foreign-кодом, а который попадает - our-кодом.
DRD репортит два типа гонок:
Как ограничить Sync/Race Detection scopes, как указать DRD, какие foreign-методы write, а какие нет и т.д. - см. Documentation.
drd.log: информационные сообщения - ход инструментации, разнообразная статистика
drd_error.log: ошибки
drd_races.log: обнаруженные гонки
Путь к папке для log-файлов можно указать с помощью property "drd.log.dir". По умолчанию лог-файлы создаются в рабочей директории. Путь к лог-файлам пишется в консоли (System.out) сразу же после запуска DRD.
Подробнее о содержимом файлов и о том, как трактовать обнаруженные гонки см. Анализ логов.
Важно: при отправке баг-репорта на drd-support@devexperts.com, пожалуйста, прикладывайте оба лог-файла к письму.
Будет заполняться по мере использования DRD