Избирательные ворота
![]() Логотип Валгринд | |
Оригинальный автор(ы) | Джулиан Сьюард , Николас Незеркот [1] |
---|---|
Разработчик(и) | Команда разработчиков Валгринд [2] |
Первоначальный выпуск | 27 июля 2002 г. [3] |
Стабильная версия | 3.23.0 (26 апреля 2024 г [±] [4] | )
Репозиторий | |
Написано в | С |
Операционная система | Линукс FreeBSD Солярис Андроид [5] |
Тип | Профилировщик , отладчик памяти |
Лицензия | Стандартная общественная лицензия GNU |
Веб-сайт | www |
Валгринд ( / ˈ v æ l ɡ r ɪ n d / ) [6] — инструмент программирования для отладки памяти , обнаружения утечек памяти и профилирования .
Первоначально Valgrind был разработан как свободно лицензируемый инструмент отладки памяти для Linux на x86 , но с тех пор превратился в общую среду для создания инструментов динамического анализа, таких как средства проверки и профилирования.
Обзор [ править ]
Valgrind, по сути, представляет собой виртуальную машину, использующую методы JIT-компиляции , включая динамическую перекомпиляцию . Ничто из исходной программы никогда не запускается непосредственно на хост -процессоре . Вместо этого Valgrind сначала переводит программу во временную, более простую форму, называемую промежуточным представлением (IR), которая представляет собой нейтральную к процессору статическую форму с одним присвоением , основанную на форме. После преобразования инструмент (см. ниже) может выполнять любые преобразования IR, прежде чем Valgrind преобразует IR обратно в машинный код и позволяет хост-процессору запустить его. Valgrind перекомпилирует двоичный код для работы на хосте и целевых (или смоделированных) процессорах одной и той же архитектуры. Он также включает в себя заглушку GDB , позволяющую отлаживать целевую программу во время ее работы в Valgrind, с «командами мониторинга», которые позволяют запрашивать у инструмента Valgrind различную информацию.
При этих преобразованиях (и обычно в коде, вставляемом инструментом) теряется значительная часть производительности; обычно код, запускаемый с помощью Valgrind, и инструмент «none» (который ничего не делает с IR) работает со скоростью от 20% до 25% от скорости обычной программы. [7] [8]
Инструменты [ править ]
Проверка памяти [ править ]
В Valgrind включено несколько инструментов (и несколько внешних). Инструмент по умолчанию (и наиболее часто используемый) — Memcheck . Memcheck вставляет дополнительный инструментальный код практически ко всем инструкциям, который отслеживает правильность (вся нераспределенная память начинается как недействительная или «неопределенная», пока она не будет инициализирована в детерминированное состояние, возможно, из другой памяти) и адресуемость (независимо от того, находится ли адрес памяти в вопрос указывает на выделенный, не освобожденный блок памяти), хранящийся в так называемых битах V и битах A соответственно. Когда данные перемещаются или манипулируются ими, инструментальный код отслеживает биты A и V, поэтому они всегда верны на однобитовом уровне.
Кроме того, Memcheck заменяет стандартные распределители C++ и распределителя памяти C своей собственной реализацией, которая также включает защиту памяти вокруг всех выделенных блоков (с битами A, установленными в «недействительные»). Эта функция позволяет Memcheck обнаруживать ошибки с отклонением на единицу , когда программа читает или записывает данные за пределы выделенного блока на небольшую величину. Проблемы, которые Memcheck может обнаружить и предупредить, включают следующее:
- Чтение неинициализированной памяти
- Чтение/запись недействительной памяти, которая может быть
- память, которая была
free
бы - память за пределами
malloc
блоки - память под указателем стека
- память, которая была
- Использование неверных параметров для системных вызовов
- Небезопасное перекрытие копий памяти с
mem*
иstr*
функции - Утечки памяти
- Несовпадающие выделения и освобождения, которые могут быть
- смешивание C и C++, например,
malloc
иdelete
- смешивание скаляра и массива, например,
new
иdelete[]
- размер освобождения не совпадает с размером выделения
- выровненное освобождение — это не то же самое выравнивание, что и выделение
- смешивание C и C++, например,
- Использование неправильного выравнивания
- Использование
realloc
с нулевым размером
Цена этого – потеря производительности. Программы, работающие под Memcheck, обычно работают в 20–30 раз медленнее. [9] чем работать за пределами Valgrind и использовать больше памяти (за каждое выделение взимается штраф). Таким образом, лишь немногие разработчики постоянно запускают свой код с помощью Memcheck (или любого другого инструмента Valgrind). Чаще всего они используют такие инструменты либо для отслеживания какой-то конкретной ошибки, либо для проверки отсутствия скрытых ошибок (тех, которые может обнаружить Memcheck) в коде.
Другие инструменты [ править ]
Помимо Memcheck, в Valgrind есть еще несколько инструментов: [10]
- None , запускает код на виртуальной машине без выполнения какого-либо анализа и, таким образом, имеет минимальную нагрузку на процессор и память среди всех инструментов. Поскольку сам Valgrind обеспечивает обратную трассировку от ошибки сегментации , инструмент none обеспечивает эту обратную трассировку с минимальными издержками.
- Addrcheck похож на Memcheck, но с гораздо меньшими нагрузками на процессор и память, что позволяет выявлять меньше типов ошибок. Addrcheck был удален начиная с версии 3.2.0. [11]
- Massif — кучи профилировщик . Отдельный графический визуализатор массива визуализирует выходные данные Massif.
- Helgrind и DRD обнаруживают состояния гонки в многопоточном коде
- Cachegrind — профилировщик кэша . Отдельный графический интерфейс KCacheGrind визуализирует выходные данные Cachegrind.
- Callgrind — анализатор графа вызовов , созданный Йозефом Вайдендорфером, добавленный в Valgrind начиная с версии 3.2.0. KCacheGrind может визуализировать выходные данные Callgrind.
- DHAT — инструмент динамического анализа кучи, который анализирует, сколько памяти выделено и как долго, а также закономерности использования памяти.
- exp-bbv — симулятор производительности, который экстраполирует производительность на небольшом наборе выборок.
exp-sgcheck ( называвшийся exp-ptrcheck до версии 3.7 ) был удален в версии 3.16.0. Это был экспериментальный инструмент для поиска ошибок переполнения стека и глобального массива, которые Memcheck не может обнаружить.
Также доступно несколько инструментов сторонней разработки. Одним из таких инструментов является ThreadSanitizer, еще один детектор состояний гонки . [12] [13]
Поддерживаемые платформы [ править ]
Начиная с версии 3.4.0, Valgrind поддерживает Linux на x86 , x86-64 и PowerPC . Поддержка Linux на ARMv7 (используется, например, в некоторых смартфонах ) была добавлена в версии 3.6.0. [14] Поддержка Solaris была добавлена в версии 3.11.0. [5] Поддержка OS X была добавлена в версии 3.5.0. [15] Поддержка FreeBSD x86 и amd64 была добавлена в версии 3.18.0. Поддержка FreeBSD aarch64 была добавлена в версии 3.23.0. Существуют неофициальные порты на другие Unix-подобные платформы (например, OpenBSD , [16] NetBSD [17] и QNX [18] ). ARM/ Android . С версии 3.7.0 добавлена поддержка платформы [5]
Начиная с версии 3.9.0 поддерживается Linux на MIPS64 с прямым и прямым порядком байтов, для MIPS DSP ASE на MIPS32 , для s390x инструкций с десятичной плавающей запятой , для инструкций POWER8 ( Power ISA 2.07 ), для инструкций Intel AVX2 , для расширений Intel Transactional Synchronization Extensions. , как RTM, так и HLE, а также начальную поддержку аппаратной транзакционной памяти на POWER. [4]
и развитие История
Название Валгринд является отсылкой к главному входу в Валгаллу из скандинавской мифологии . [19] [20] Во время разработки (до релиза) проект назывался Heimdall ; однако это имя противоречило бы пакету безопасности.
Первоначальным автором Valgrind является Джулиан Сьюард , который в 2006 году получил премию Google-O'Reilly Open Source Award за свою работу над Valgrind. [21] [22]
Несколько других также внесли значительный вклад, в том числе Николас Нетеркот, Барт Ван Аш, Флориан Кром, Том Хьюз, Филипп Варокье, Марк Вилаард, Пол Флойд, Петар Йованович, Карл Лав, Церион Армур-Браун и Иво Райср. [23]
Он используется рядом проектов на базе Linux. [24]
Ограничения Memcheck [ править ]
Помимо снижения производительности, важным ограничением Memcheck является его неспособность обнаружить все случаи ошибок границ при использовании статических данных или данных, выделенных в стеке. [25] Следующий код без проблем пропустит инструмент Memcheck в Valgrind, несмотря на ошибки, описанные в комментариях:
int Static[5];
int func(void)
{
int Stack[5];
Static[5] = 0; /* Error - Static[0] to Static[4] exist, Static[5] is out of bounds */
Stack [5] = 0; /* Error - Stack[0] to Stack[4] exist, Stack[5] is out of bounds */
return 0;
}
Невозможность обнаружить все ошибки, связанные с доступом к данным, выделенным в стеке, особенно примечательна, поскольку определенные типы ошибок стека делают программное обеспечение уязвимым для классического эксплойт для разрушения стека .
См. также [ править ]
Примечания [ править ]
- ^ «АВТОРЫ» . valgrind.org . Проверено 19 сентября 2022 г.
- ^ «Валгринд: Разработчики» .
- ^ «Двадцать лет Валгринду» . Проверено 4 августа 2023 г.
- ^ Jump up to: Перейти обратно: а б Новости Валгринд
- ^ Jump up to: Перейти обратно: а б с Примечания к выпуску Валгринда
- ^ «Вальгринд» . valgrind.org . Проверено 4 мая 2023 г.
- ^ Домашняя страница Валгринда
- ^ Руководство Валгринд
- ^ «Вальгринд» .
- ^ Основной список инструментов Valgrind
- ^ «Вальгринд» .
- ^ «Валгринд: Варианты/Патчи» .
- ^ К. Серебряный, Т. Исходжанов, ThreadSanitizer – обнаружение гонок данных на практике , Материалы семинара по двоичному инструментированию и приложениям WBIA'09
- ^ Порт ARM/Linux
- ^ Экспорт ОС
- ^ Порт Valgrind OpenBSD
- ^ «Порт Valgrind NetBSD» . Архивировано из оригинала 9 февраля 2006 г. Проверено 28 января 2006 г.
- ^ «foundry27: Посмотреть выпуск» . сообщество.qnx.com . Проверено 24 мая 2024 г.
- ^ Часто задаваемые вопросы о Валгринде
- ^ «Комиксы» . Валуспа.org .
- ^ список наград valgrind.org.
- ^ Google-O'Reilly Open Source Awards - Зал славы
- ^ Разработчики Valgrind
- ^ список пользователей valgrind.org
- ^ Часто задаваемые вопросы о Валгринде
Ссылки [ править ]
- Нетеркот, Николас; Сьюард, Джулиан. «Valgrind: основа для тяжеловесного динамического двоичного инструментария» . Материалы конференции ACM SIGPLAN 2007 по проектированию и реализации языков программирования (PLDI 2007) . АКМ.
- Сьюард, Джулиан; Нетеркот, Николас (10 апреля 2005 г.). «Использование Valgrind для обнаружения ошибок неопределенных значений с побитовой точностью» . Материалы ежегодной технической конференции USENIX, 2005 г. Ассоциация USENIX: 2.
- Сьюард, Дж.; Нетеркот, Н.; Вайдендорфер, Дж.; Команда разработчиков Valgrind (март 2008 г.). Valgrind 3.3 — расширенная отладка и профилирование приложений GNU/Linux . Network Theory Ltd., стр. 164 страницы. ISBN 978-0-9546120-5-4 .
Внешние ссылки [ править ]
