ISSN 2305-5626. Вестник МГТУ им. Н.Э. Баумана: электронное издание. 2013
1
УДК 004.415.53
Использование системы LLVM
при динамическом поиске
состояний гонок в программах
Д.Н. Ковега
1
, В.А. Крищенко
1
1
МГТУ им. Н.Э. Баумана, Москва, 105005, Россия
В многопоточных программах может возникать состояние гонок
ввиду отсутствия синхронизации при доступе к памяти. Для сбора
информации о событиях динамическими методами выявления таких
гонок требуется либо виртуальная машина, либо инструментирова-
ние исполняемого кода. В работе предложен метод динамического
поиска гонок, использующий отношение предшествования и ограни-
чение истории обращений. Метод реализован для анализа программ
на языке С, для инструментирования исходного кода на этапе транс-
ляции используется система LLVM. Как показывают проведенные
эксперименты, применение предложенного метода позволяет сохра-
нить накладные расходы на поиск гонок на приемлемом уровне.
E-mail:
,
Ключевые слова:
состояния гонок, динамический поиск гонок, инстру-
ментирование кода, тестирование многопоточных программ, LLVM.
При разработке параллельных приложений часто возникают
трудные в локализации ошибки, вызванные нарушениями в синхро-
низации доступа потоков в общей памяти, которые приводят к состо-
янию гонки между потоками. Для поиска состояний гонок при работе
с разделяемой памятью в многопоточных программах существуют
инструменты нескольких классов, наиболее применимым являются
средства динамического поиска гонок. Такие средства во время вы-
полнения программы ведут историю обращений к памяти и операций
синхронизации для дальнейшего анализа.
Генерация потока событий при динамическом поиске гонок может
реализоваться либо при исполнении программы в виртуальной машине,
либо посредством модификации кода программы для сбора информа-
ции о доступе к памяти и к функциям синхронизации. Существующие
реализации на базе виртуальной машины, такие как Helgrind [1] и
Thread Checker, осуществляют интерпретацию исполняемого файла, что
позволяет проводить анализ программы и используемых библиотек без
необходимости повторной компиляции или внесения изменений в би-
нарные файлы. Основной проблемой таких инструментов являются вы-
сокие накладные расходы на интерпретацию анализируемого машинно-
го кода: так, детекторы Thread Checker и Helgrind снижают
производительность анализируемой программы в 10—200 раз [2].
Подход на основе инструментирования кода заключается в до-
бавлении в исполняемый файл кода для генерации событий при до-
1 2,3,4,5,6,7,8