Автор (ы) | Джулиан Сьюард |
---|---|
Разработчик (и) | Команда разработчиков Valgrind |
Стабильный выпуск | 3.16.1 (22 июня 2020 г.; 4 месяца назад (2020-06-22)) |
Репозиторий | |
Операционная система | Linux. macOS. Solaris. Android |
Тип | Profiler, Отладчик памяти |
Лицензия | GNU Стандартная общественная лицензия |
Веб-сайт | www.valgrind.org |
Valgrind () - это инструмент программирования для отладки памяти, утечки памяти. обнаружение и профилирование.
Valgrind изначально был разработан как бесплатный инструмент отладки памяти для Linux на x86, но с тех пор превратился в общую платформу для создания инструментов динамического анализа, таких как средства проверки и профилировщик.
Имя Валгринд - это ссылка на главный вход в Валгаллу из скандинавской мифологии. Во время разработки (перед выпуском) проект назывался Heimdall ; однако имя могло бы конфликтовать с пакетом безопасности.
Valgrind по сути является виртуальной машиной, использующей точно в срок (JIT) методы компиляции, включая динамическую перекомпиляцию. Ничто из исходной программы никогда не запускается непосредственно на главном процессоре. Вместо этого Valgrind сначала переводит программу во временную, более простую форму, называемую промежуточным представлением (IR), которая не зависит от процессора и основана на SSA. После преобразования инструмент (см. Ниже) может свободно выполнять любые преобразования, которые он хочет в IR, прежде чем Valgrind переведет IR обратно в машинный код и позволит хост-процессору запустить его. Valgrind перекомпилирует двоичный код для работы на хосте и целевых (или смоделированных) процессорах одной архитектуры. Он также включает заглушку GDB, позволяющую отлаживать целевую программу во время ее работы в Valgrind, с «командами монитора», которые позволяют вам запрашивать у инструмента Valgrind информацию различного рода.
При этих преобразованиях (и обычно коде, который вставляет инструмент) теряется значительная часть производительности; обычно код запускается с помощью Valgrind, а инструмент «none» (который ничего не делает с IR) работает на 20–25% скорости нормальной программы.
В Valgrind входит несколько инструментов (и несколько внешних). Инструмент по умолчанию (и наиболее часто используемый) - Memcheck. Memcheck вставляет дополнительный код инструментария вокруг почти всех инструкций, который отслеживает правильность (вся нераспределенная память начинается как недействительная или «неопределенная», пока она не будет инициализирована в детерминированное состояние, возможно, из другой памяти) и адресуемость (указывает, указывает ли рассматриваемый адрес памяти на выделенный, не освобожденный блок памяти), хранящиеся в так называемых битах V и A соответственно. Когда данные перемещаются или обрабатываются, инструментальный код отслеживает биты A и V, поэтому они всегда верны на однобитовом уровне.
Кроме того, Memcheck заменяет стандартный распределитель памяти C своей собственной реализацией, которая также включает в себя защиту памяти вокруг всех выделенных блоков (с битами A, установленными в «недействительный»). Эта функция позволяет Memcheck обнаруживать единичные ошибки, когда программа читает или записывает небольшой объем вне выделенного блока. Memcheck может обнаружить и предупредить следующие проблемы:
свободна
'dmalloc
'd блокиЦена этого - потеря производительности. Программы, работающие под Memcheck, обычно работают в 20–30 раз медленнее, чем за пределами Valgrind, и используют больше памяти (есть штраф памяти за выделение). Таким образом, немногие разработчики постоянно запускают свой код под Memcheck (или любым другим инструментом Valgrind). Чаще всего они используют такие инструменты либо для отслеживания некоторой конкретной ошибки, либо для проверки отсутствия скрытых ошибок (тех, которые может обнаружить Memcheck) в коде.
Помимо Memcheck, у Valgrind есть несколько других инструментов:
Также доступно несколько инструментов внешней разработки. Одним из таких инструментов является ThreadSanitizer, еще один детектор состояний гонки.
Начиная с версии 3.4.0, Valgrind поддерживает Linux на x86, x86-64 и PowerPC. Поддержка OS X была добавлена в версии 3.5.0. Поддержка Linux на ARMv7 (используется, например, в некоторых смартфонах ) была добавлена в версии 3.6.0. Поддержка Solaris была добавлена в версии 3.11.0. Существуют неофициальные порты на другие UNIX-подобные платформы (например, FreeBSD, OpenBSD и NetBSD ). Начиная с версии 3.7.0 добавлена поддержка платформы ARM / Android.
Начиная с версии 3.9.0, на MIPS64 появилась поддержка Linux. прямой и большой порядок байтов для MIPS DSP ASE на MIPS32, для инструкций s390x Decimal Floating Point, для инструкций POWER8 (Power ISA 2.07 ), для Intel Инструкции AVX2 для расширений Intel Transactional Synchronization Extensions, RTM и HLE, а также начальная поддержка аппаратной транзакционной памяти на POWER.
Он назван в честь главного входа в Валгалла в скандинавской мифологии.
Первоначальным автором Valgrind является Джулиан Сьюард, который в 2006 году выиграл премию Google-O'Reilly Open Source Award за его работу над Valgrind.
Некоторые другие также внесли значительный вклад, в том числе Cerion Armor-Brown, Джереми Фитцхардинг, Том Хьюз, Николас Нетеркот, Пол Маккеррас, Дирк Мюллер, Барт Ван Аше, Йозеф Вайдендорфер и Роберт Уолш.
Это используется в ряде проектов на базе Linux.
Помимо снижения производительности, важным ограничением Memcheck является его неспособность обнаруживать все случаи ошибок границ в использование статических данных или данных, размещенных в стеке. Следующий код без проблем передаст инструмент Memcheck в Valgrind, несмотря на наличие ошибок, описанных в комментариях:
int Static [5]; int func (void) {int Stack [5]; Статический [5] = 0; / * Ошибка - существует статическое [0] в статическое [4], статическое [5] выходит за пределы * / Stack [5] = 0; / * Ошибка - существует стек [0] в стек [4], стек [5] выходит за границы * / return 0; }
Экспериментальный инструмент valgrind exp-sgcheck был написан для устранения этого ограничения в Memcheck. Он обнаружит ошибки переполнения массива при условии, что первый доступ к массиву находится в границах массива. Обратите внимание, что exp-sgcheck не обнаружит переполнение массива в приведенном выше коде, поскольку первый доступ к массиву находится за пределами границ, но обнаружит ошибку переполнения массива в следующем коде.
void func (void) {int i, Stack [5]; for (i = 0; i <= 5; i++) Stack [i] = 0; /* Within bounds for i=0..4, out of bounds error when i=5 */ }
Невозможность обнаружить все ошибки, связанные с доступом к данным, выделенным стеку, особенно примечательна, поскольку некоторые типы ошибок стека делают программное обеспечение уязвимым для классических эксплойт для разбивания стека.
В Викиучебнике есть книга по теме: Valgrind |