22
Динамический поиск гонок в Java- программах на основе синхронизационных контрактов Дмитрий Цителов, Devexperts LLC Виталий Трифанов, Devexperts LLC, мат-мех СПбГУ

TMPA-2013 Tsytelov Trifanov Devexperts

Embed Size (px)

DESCRIPTION

Tools & Methods of Program Analysis (TMPA-2013) Tsytelov, D., Trifanov, V., Devexperts LLC, St. Petersburg State University Search of Race Conditions in Java Programs Based on Synchronization Contracts

Citation preview

Page 1: TMPA-2013 Tsytelov Trifanov Devexperts

Динамический поиск гонок в Java-программах на основе синхронизационных

контрактов

Дмитрий Цителов, Devexperts LLCВиталий Трифанов, Devexperts LLC, мат-мех

СПбГУ

Page 2: TMPA-2013 Tsytelov Trifanov Devexperts

Состояния гонки

• 2+ потоков• к одним и тем же данным• хотя бы одно из них - запись

• Обычно это ошибка

Page 3: TMPA-2013 Tsytelov Trifanov Devexperts

Пример гонкиpublic class Account {

private int amount = 0;public void deposit(int x) {amount += x;}public int getAmount() {return amount;}

}

public class TestRace { public static void main (String[] args) { final Account a = new Account(); Thread t1 = depositAccountInNewThread(a, 5); Thread t2 = depositAccountInNewThread(a, 6); t1.join(); t2.join(); System.out.println(account.getAmount()); //5? 6? 11?.

}}

Page 4: TMPA-2013 Tsytelov Trifanov Devexperts

Свойства гонок

• Опасны– Повреждают глобальные данные– Не приводят к немедленному отказу

программы

• Сложно обнаружить вручную

• Трудно воспроизводимы

Page 5: TMPA-2013 Tsytelov Trifanov Devexperts

Статический подход

• Анализ кода программы без её запуска

• Расширение языка, система типов

• Ограниченная глубина анализа

• Есть много утилит для Java– FindBugs, jChord, etc.

Page 6: TMPA-2013 Tsytelov Trifanov Devexperts

Динамический подход

• Анализирует только текущий путь выполнения

• Поддерживает все средства синхронизации

• Огромные накладные расходы

• Нет готовых детекторов для Java

Page 7: TMPA-2013 Tsytelov Trifanov Devexperts

Java Memory Model

• На синхронизационных событиях есть отношение порядка «synchronized-with»

• Synchronized-with + порядок событий в одном потоке = частичное отношение порядка happens-before

• Отслеживаем happens-before с помощью векторных(логических) часов Ламперта

• Метод точный, но много накладных расходов

Page 8: TMPA-2013 Tsytelov Trifanov Devexperts

Идея

• Приложения используют библиотеки через API• API хорошо документировано– Класс XXX потокобезопасен– Класс YYY непотокобезопасен– ZZZ.get() синхронизирован с ZZZ.put()

• Опишем поведение API• Исключим библиотеку из анализа

Page 9: TMPA-2013 Tsytelov Trifanov Devexperts

Пример синхронизационного контракта

Page 10: TMPA-2013 Tsytelov Trifanov Devexperts

Типы связей

• Явные• Простые• Сигнатура метода:

retval owner.method(parameters)

• Любая комбинация простых связей• Условия на возвращаемое значение

Page 11: TMPA-2013 Tsytelov Trifanov Devexperts

Примитивные простые явные связи

Owner Param Return value

Owner chm.put(k, v) ↓

chm.get(k)

ex.sumbit(task) ↓

task.run()Наверное, тоже

бывает

Paramchm.put(k, v)

↓chm.get(k)

Наверное, тоже бывает

Return valueНаверное, тоже

бывает

Page 12: TMPA-2013 Tsytelov Trifanov Devexperts

Пример описания контракта

Page 13: TMPA-2013 Tsytelov Trifanov Devexperts

Пример описания контракта

Page 14: TMPA-2013 Tsytelov Trifanov Devexperts

Язык контрактов

• Happens-before контракты– пары методов– всех методов класса

• Потокобезопасность метода– ну, или всех методов класса (умеем «*»)

• Тип непотокобезопасного метода– Read– Write (по умолчанию)

Page 15: TMPA-2013 Tsytelov Trifanov Devexperts

Области анализа

(RD)

(SD)

Page 16: TMPA-2013 Tsytelov Trifanov Devexperts

Алгоритм

• В основе – отслеживание happens-before• Операции синхронизации в SD:– synchronized, volatile, thread start/join, …– happens-before контракты– не отслеживаем, если в контрактном методе

• Обращения к данным в RD (RD ∈ SD):– к полям классов из RD– вызовы непотокобезопасных методов классов,

не принадлежащих RD

Page 17: TMPA-2013 Tsytelov Trifanov Devexperts

Реализация

ConfigRace

detection module

Instrumented app classes

interceptorApplication classes jDRD agent

Page 18: TMPA-2013 Tsytelov Trifanov Devexperts

Детали реализации

• Не сломать сериализацию

• Не давать разрастаться часам

• Хранение контрактов

• Не генерировать garbage

Page 19: TMPA-2013 Tsytelov Trifanov Devexperts

Экспериментальные результаты

Приложение JTT QD MARS client MARS Server

Режим base juc base juc base juc base juc

Синхр. оп-ий/мин 115К 28К 15М 7.2М 7.4 М 4.3 М 1650К 800К

Кол-во синх. часов 13К 7К 6.1K 0.2K 85K 72K 15К 14К

Контрактов/мин 2.3K 0.6K 209К 130К 980К 730К 360К 904К

Кол-во контр. часов 8.5K 0.75K 1.4М 1.4М 17К 24К 5.5К 5.5К

Найдено гонок 8 10 1 6 1 5 2 2

Page 20: TMPA-2013 Tsytelov Trifanov Devexperts

Ограничения

• Трактуем контракты как атомарные– это неизбежно для неблокирующих средств

синхронизации – volatile, etc.• Только контракты на основе простых связей

– Если сложней, то просто не описывать, детектор шагнёт «внутрь» метода

– Lock.newCondition().await() – печаль– ConcurrentMap.entrySet().iterator() – печаль

• Только контракты без сайд-эффектов– Грубо говоря, только контейнеры– Если Executor вызовет task.foo() вместо run() – печаль.

Page 21: TMPA-2013 Tsytelov Trifanov Devexperts

Заключение

• Модифицировали happens-before• Научились легко описывать контракты• В экспериментах не потеряли точность• Нашли больше гонок• Стало меньше часов• Стало меньше шума

• Хорошо, но всё еще впереди– Open source– Доработка языка и детектора– Эксперименты

Page 22: TMPA-2013 Tsytelov Trifanov Devexperts

Спасибо!

• Пишите нам:– [email protected][email protected][email protected]

• Можно скачать и попробовать:– http://code.devexperts.com/display/DRD/ – Это еще бета-версия