Тип работы:
Предмет:
Язык работы:


Реализация внесения неисправностей для тестирования многопоточного кода на C++

Работа №142516

Тип работы

Бакалаврская работа

Предмет

прикладная информатика

Объем работы30
Год сдачи2022
Стоимость4600 руб.
ПУБЛИКУЕТСЯ ВПЕРВЫЕ
Просмотрено
36
Не подходит работа?

Узнай цену на написание


Введение 4
Постановка задачи 6
1. Обзор предметной области 7
1.1. Возможные подходы к внесению неисправностей для мно­гопоточных C++ программ 7
1.1.1 Внесение неисправностей раз в определенное время . . 7
1.1.2 Внесение неисправностей при возникновении опреде­ленных событий 8
1.1.3 Использование собственного планировщика 8
1.2. Проверка моделей 8
1.3. Существующие имплементации 9
1.3.1 Flow 9
1.3.2 Twist 9
1.3.3 ClickHouse ThreadFuzzer 9
1.3.4 Сравнение аналогов 10
1.4. Выводы 11
2. Архитектура и особенности реализации 12
2.1. Заголовочные файлы yaclib_std и обертки для внесения неис­правностей 12
2.2. Интерфейс использования 13
2.3. Конфигурация получаемого исполнения 16
2.4. Моделирование редких событий 16
2.5. Класс Injector 17
2.6. Реализация легких потоков для Linux 18
2.6.1 Планировщик 19
2.6.2 Работа с контекстами 20
2.6.3 Аналоги примитивов стандартной библиотеки 22
3. Тестирование 25
3.1. Результаты внедрения в библиотеку YACLib 25
Заключение 26
Список литературы 28

Тестирование многопоточного кода является очень сложной задачей. Сложность заключается в большом количестве исполнений, которые можно наблюдать. Это является следствием того что планировщики в современ­ных операционных системах, как правило, реализуют вытесняющую много­задачность [16] и от этого порядок исполнения становится намного более недетерминированным, а ошибки в коде, связанные с многопоточным кодом, проявляются не на всех исполнениях, а только на части из них. Такие ис­полнения можно охарактеризовать тем что они содержат в себе чередования между потоками, которые были не предусмотренны программистом. Пробле­ма заключается в том, что на то, какое у нас получится исполнение, сильно влияет состояние системы, в частности нагрузка на нее и время работы и на модульных тестах поведение планировщика получается детерминирован­ным и повторение одного и того же теста дает одни и те же исполнения [1]. Поэтому качественно увеличить число исполнений, которые будут покрыты тестами достаточно сложно.
Один из способов покрытия большего числа исполнений тестами - это стресс тестирование. Однако, чтобы создать нужные условия, может пона­добиться запускать тесты, которые будут исполняться несколько часов и их падения будут непостоянными и долго воспроизводимыми, что будет очень затруднять отладку [1]. В этом случае вероятность, с которой мы будем на­блюдать ошибки, примерно равна той, что будет получаться в реальном мире.
Внесение неисправностей позволяет увеличить вероятность получения исполнения, приводящего к ошибке, вставляя сон, переход на другие ядра или потоки в некоторые точки в программе, моделируя таким образом неопти­мальное поведение планировщика [5]. Оно так же позволяет моделировать ситуации, которые не произошли бы в обычных условиях, например ложные падения compare_exchange_weak [18]. В ситуации, когда исполнение, по­лучаемое под внесением неисправностей, качественно зависит от параметра случайности, мы можем с более быстрой скоростью исследовать пространство исполнений, где что-то может пойти не так, чем в обычных условиях.
На данный момент нами не было найдено открытого решения, кото­рое реализует внесение неисправностей планировщика, является удобным к интегрированию в проекты не с самого начала их разработки, и к тому же поддерживает ограниченную детерминированность исполнения. Поэтому мы решили реализовать модуль для открытой библиотеки YACLib [25], который будет реализовывать внесение неисправностей и будет иметь интерфейс, поз­воляющий постепенно и без больших изменений в коде внедрять внесение неисправности в уже существующие проекты.
Убрать недетерминизм, привносимый много поточностью, сохранив на­стоящее многоядерное исполнение, невозможно, так как останется случай­ность, привносимая аппаратным обеспечением, но в качестве решения этой проблемы можно заменить всю многопоточность на строго программную, ис­пользуя свои аналоги потоков, написанные на уровне пространства пользова­теля [6], которые мы далее будем называть легкими потоками. Такое решение, что не маловажно, даст нам полный контроль над получаемым исполнением, так как реализация планировщика так же выбирается нами. Однако этот вари­ант более сложен для внедрения целиком в большие существующие проекты и он больше всего актуален для внедрения в отдельные подмодули или в модульные тесты библиотек.

Возникли сложности?

Нужна помощь преподавателя?

Помощь в написании работ!


В ходе данной работы удалось реализовать внесение неисправностей, которое удобно внедрять в проекты не с самого начала их разработки, которое так же поддерживает частичную воспроизводимость исполнения, благодаря опционального исполнения на легких потоках, исполняющихся на одном по­токе операционной системы.
Из этого следует, что решение имеет свойства, которых не доставало известным аналогам.Таким образом, в ходе выполнения данной бакалаврской работы были получены следующие результаты:
• Сделан обзор предметной области. Рассмотрены основные подходы к внесению неисправностей и проведен обзор известных реализаций вне­сения неисправностей.
• Разработан интерфейс использования, с помощью которого было бы удобно внедрять внесение неисправностей в существующие проекты.
• Реализовано внесение неисправностей на основе потоков операционной системы.
• Реализовано внесение неисправностей на основе легких потоков, испол­няющихся на одном потоке операционной системы, предоставляющее возможность ограниченной воспроизводимости.
• Произведена аппробация на тестах библиотеки YACLib.
Код работы: https://github.com/YACLib/YACLib/commits/myannyax/fault- fibers-1thread
В качестве возможного пути дальшейшего развития можно рассмотреть реализацию исполнения на легких потоках, исполняющихся на нескольких потоках операционной системы. Такое решение так же будет иметь гибкую конфигурацию исполнения, как и исполнение легких потоков на одном потоке операционной системы, но в отличии от него, это решение не будет требовать избавление от всего блокирующего ожидания в программе.


[1] Yosi Ben-Asher и др. “Producing Scheduling That Causes Concurrent Programs to Fail”. В: Proceedings of the 2006 Workshop on Parallel and Distributed Systems: Testing and Debugging. PADTAD ’06. Portland, Maine, USA: Association for Computing Machinery, 2006, с. 37—40. ISBN: 1595934146. DOI: 10.1145/1147403.1147410. URL: https: //doi.org/10.1145/1147403.1147410.
[2] Sebastian Burckhardt и др. “A Randomized Scheduler with Probabilistic Guarantees of Finding Bugs”. В: SIGARCH Comput. Archit. News 38.1 (март 2010), с. 167—178. ISSN: 0163-5964. DOI: 10.1145/1735970. 1736040. URL: https://doi.org/10.1145/1735970.1736040.
[3] ClickHouse / ThreadFuzzer.h. URL: https : / / github . com / ClickHouse / ClickHouse / blob / master / src / Common / ThreadFuzzer.h. (дата обращения 25.04.2022).
[4] Code Injection on Linux and macOS with LDPRELOAD. URL: https : //www . getambassador . io/resources/code-injection- on-linux-and-macos/. (дата обращения 25.04.2022).
[5] Y. Eytani, E. Farchi и Y. Ben-Asher. “Heuristics for finding concurrent bugs”. В: Proceedings International Parallel and Distributed Processing Symposium. 2003, 8 pp.-. DOI: 10 . 1109/IPDPS . 2003 . 1213514.
[6] Fiber. URL: https : / / en . wikipedia . org / wiki / Fiber _ (computer_science). (дата обращения 25.04.2022).
[7] Flow. URL: https : //github . com/apple/foundationdb/tree/ master/flow. (дата обращения 25.04.2022).
[8] FoundationDB. URL: https://www.foundationdb.org. (дата обра­щения 25.04.2022).
[9] google/googletest: GoogleTest - Google Testing and Mocking Framework. URL: https://github.com/google/googletest. (дата обращения 25.04.2022).
[10] Mei-Chen Hsueh, Timothy K Tsai и Ravishankar K Iyer. “Fault injection techniques and tools”. В: Computer 30.4 (1997), с. 75—82.
[11] ld.so(8) - Linux manual page. URL: https://man7.org/linux/man- pages/man8/ld.so.8.html. (дата обращения 25.04.2022).
[12] linux-test-project/lcov: LCOV. URL: https : //github . com/linux- test-project/lcov. (дата обращения 25.04.2022).
[13] Mary /fork. URL: https : //gitlab . com/mary3000/fork. (дата обращения 25.04.2022).
[14] Brian Norris и Brian Demsky. “A practical approach for model checking C/C++ 11 code”. В: ACM Transactions on Programming Languages and Systems (TOPLAS) 38.3 (2016), с. 1—51.
[15] Doron A Peled, Patrizio Pelliccione и Paola Spoletini. Model Checking. 2008....25


Работу высылаем на протяжении 30 минут после оплаты.



Подобные работы


©2025 Cервис помощи студентам в выполнении работ