tmpa-2013 tsytelov trifanov devexperts
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 ContractsTRANSCRIPT
![Page 1: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/1.jpg)
Динамический поиск гонок в Java-программах на основе синхронизационных
контрактов
Дмитрий Цителов, Devexperts LLCВиталий Трифанов, Devexperts LLC, мат-мех
СПбГУ
![Page 2: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/2.jpg)
Состояния гонки
• 2+ потоков• к одним и тем же данным• хотя бы одно из них - запись
• Обычно это ошибка
![Page 3: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/3.jpg)
Пример гонки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](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/4.jpg)
Свойства гонок
• Опасны– Повреждают глобальные данные– Не приводят к немедленному отказу
программы
• Сложно обнаружить вручную
• Трудно воспроизводимы
![Page 5: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/5.jpg)
Статический подход
• Анализ кода программы без её запуска
• Расширение языка, система типов
• Ограниченная глубина анализа
• Есть много утилит для Java– FindBugs, jChord, etc.
![Page 6: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/6.jpg)
Динамический подход
• Анализирует только текущий путь выполнения
• Поддерживает все средства синхронизации
• Огромные накладные расходы
• Нет готовых детекторов для Java
![Page 7: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/7.jpg)
Java Memory Model
• На синхронизационных событиях есть отношение порядка «synchronized-with»
• Synchronized-with + порядок событий в одном потоке = частичное отношение порядка happens-before
• Отслеживаем happens-before с помощью векторных(логических) часов Ламперта
• Метод точный, но много накладных расходов
![Page 8: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/8.jpg)
Идея
• Приложения используют библиотеки через API• API хорошо документировано– Класс XXX потокобезопасен– Класс YYY непотокобезопасен– ZZZ.get() синхронизирован с ZZZ.put()
• Опишем поведение API• Исключим библиотеку из анализа
![Page 9: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/9.jpg)
Пример синхронизационного контракта
![Page 10: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/10.jpg)
Типы связей
• Явные• Простые• Сигнатура метода:
retval owner.method(parameters)
• Любая комбинация простых связей• Условия на возвращаемое значение
![Page 11: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/11.jpg)
Примитивные простые явные связи
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](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/12.jpg)
Пример описания контракта
![Page 13: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/13.jpg)
Пример описания контракта
![Page 14: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/14.jpg)
Язык контрактов
• Happens-before контракты– пары методов– всех методов класса
• Потокобезопасность метода– ну, или всех методов класса (умеем «*»)
• Тип непотокобезопасного метода– Read– Write (по умолчанию)
![Page 15: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/15.jpg)
Области анализа
(RD)
(SD)
![Page 16: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/16.jpg)
Алгоритм
• В основе – отслеживание happens-before• Операции синхронизации в SD:– synchronized, volatile, thread start/join, …– happens-before контракты– не отслеживаем, если в контрактном методе
• Обращения к данным в RD (RD ∈ SD):– к полям классов из RD– вызовы непотокобезопасных методов классов,
не принадлежащих RD
![Page 17: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/17.jpg)
Реализация
ConfigRace
detection module
Instrumented app classes
interceptorApplication classes jDRD agent
![Page 18: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/18.jpg)
Детали реализации
• Не сломать сериализацию
• Не давать разрастаться часам
• Хранение контрактов
• Не генерировать garbage
![Page 19: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/19.jpg)
Экспериментальные результаты
Приложение 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](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/20.jpg)
Ограничения
• Трактуем контракты как атомарные– это неизбежно для неблокирующих средств
синхронизации – volatile, etc.• Только контракты на основе простых связей
– Если сложней, то просто не описывать, детектор шагнёт «внутрь» метода
– Lock.newCondition().await() – печаль– ConcurrentMap.entrySet().iterator() – печаль
• Только контракты без сайд-эффектов– Грубо говоря, только контейнеры– Если Executor вызовет task.foo() вместо run() – печаль.
![Page 21: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/21.jpg)
Заключение
• Модифицировали happens-before• Научились легко описывать контракты• В экспериментах не потеряли точность• Нашли больше гонок• Стало меньше часов• Стало меньше шума
• Хорошо, но всё еще впереди– Open source– Доработка языка и детектора– Эксперименты
![Page 22: TMPA-2013 Tsytelov Trifanov Devexperts](https://reader033.vdocuments.net/reader033/viewer/2022052617/546201d1af7959fd5a8b46f0/html5/thumbnails/22.jpg)
Спасибо!
• Пишите нам:– [email protected]– [email protected]– [email protected]
• Можно скачать и попробовать:– http://code.devexperts.com/display/DRD/ – Это еще бета-версия