Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Примерный сценарий использования DRD

  1. SyncScope = * (отслеживаем операции синхронизации везде), RaceDetectionScope = com.mycompany.* (ищем гонки только в нашем коде);

...

  1. остальную конфигурацию

...

  1. не трогаем.
  2. Запускаемся, собираем логи. По желанию подключаем JVisualVM или какой-нибудь профайлер, смотрим на потребление памяти/cpu.
  3. Анализируем гонки и корректируем конфигурацию в зависимости от конкретной ситуации:
    • если производительность неудовлетворительна (или приложение не запустилось вовсе), то сузить область инструментирования. Например, отслеживать операции синхронизации тоже только в com.mycompany.*.
    • если DRD находит гонки по вызовам методов непроинструментированных классов, которые на самом деле гонками не являются, то стоит откорректировать contracts или убрать эти классы из области поиска гонок через SkipForeignCalls;
    • если используются какие-то внутренние механизмы синхронизации (или обнаружились непокрытые существующие), нужно создать соответствующий синхронизационный контракт;
    • если по какой-то гонке нужен второй стектрейс, то выставить в TraceConfig storeThreadAccesses="true" для соответствующего класса и поля/метода (ну, или написать "*", чтоб отслеживалось по всем полям/методам) и надеяться, что после перезапуска эта гонка произойдет снова.
  4. После корректировки конфигурации перезапускаем приложение: go to 2.

Анализ результатов

drd.log: информационные сообщения - ход инструментации, разнообразная статистика
drd_error.log: ошибки
drd_races.log: обнаруженные гонки
Путь к папке для log-файлов можно указать с помощью property "drd.log.dir". По умолчанию лог-файлы создаются в рабочей директории. Путь к лог-файлам пишется в консоли (System.out) сразу же после запуска DRD.
Подробнее о содержимом файлов и о том, как трактовать обнаруженные гонки см. Анализ логов.

...