Data Race Detector

by Devexperts

Child pages
  • Data race reporting

Терминология

DRD ищет 2 разновидности гонок:

  • по полю из "своего кода": 2 потока без синхронизации обратились к одному и тому же полю, хотя бы один - на запись;
  • по foreign call: 2 потока без синхронизации вызвали методы (в общем случае, разные) одного и того же объекта, принадлежащего исключенному коду, и хотя бы один метод трактуется DRD как модифицирующий.

Гонка всегда происходит между текущим потоком (current thread) и каким-то еще (racing thread), который ранее осуществил обращение в полю/вызов метода, которое и образует гонку с соответствующим обращением к полю/вызовом метода в текущем потоке.

Типы гонок: WRITE_WRITE, READ_WRITE, WRITE_READ. На первом месте - current thread, на втором - racing thread.

Формат

%race_type% data race occurred between currend thread %name% %id% and thread %name% %id%

Гонка по полю

Race target: FIELD %class%.%name%

Current thread %id%: %caller_class%.%caller_method% (line: %line%)

Racing thread %id%: %caller_class%.%caller_method% (line: %line%)

Гонка по foreign call

Race target: METHOD calls on %class%

Current thread %id%: called %class%.%method% from %caller_class%.%caller_method% (line: %line%)

Racing thread %id%: called %class%.%method% from %caller_class%.%caller_method% (line: %line%)

+ в обоих случая выводится стектрейс текущего потока и стектрейс racing-потока, если есть

Группировка гонок

Получается, полностью гонка определяется следующими параметрами:

Гонка по полю:

  • Target (Field class.name)
  • Thread 1
  • Location 1 (caller class/method, line number)
  • Thread 2
  • Location 2 (caller class/method, line number)

Гонка по foreign call-ам:

  • Target (Object class).
  • Thread 1
  • Location 1 (target method, caller class/method, line number)
  • Thread 2
  • Location 2 (target method, caller class/method, line number)

DRD предоставляет возможность выставить уровень группировки гонок (property "drd.races.grouping"):

  • CALL_LOCATION: уникальность гонки определяется комбинацией (Target, Location 1, Location 2).
  • CALL_CLASS_AND_METHOD: (Target, CallerClass1 + CallerMethod1, CallerClass2 + CallerMethod2)
  • CALL_CLASS: (Target, CallerClass1, CallerClass2)

 

  • No labels