Valgrind

редактировать
Инструмент программирования для профилирования, отладки памяти и обнаружения утечек памяти
Valgrind
Valgrind logo.png
Автор (ы) Джулиан Сьюард
Разработчик (и) Команда разработчиков Valgrind
Стабильный выпуск 3.16.1 (22 июня 2020 г.; 4 месяца назад (2020-06-22))
Репозиторий Измените это на Wikidata
Операционная система Linux. macOS. Solaris. Android
Тип Profiler, Отладчик памяти
Лицензия GNU Стандартная общественная лицензия
Веб-сайтwww.valgrind.org

Valgrind () - это инструмент программирования для отладки памяти, утечки памяти. обнаружение и профилирование.

Valgrind изначально был разработан как бесплатный инструмент отладки памяти для Linux на x86, но с тех пор превратился в общую платформу для создания инструментов динамического анализа, таких как средства проверки и профилировщик.

Имя Валгринд - это ссылка на главный вход в Валгаллу из скандинавской мифологии. Во время разработки (перед выпуском) проект назывался Heimdall ; однако имя могло бы конфликтовать с пакетом безопасности.

Содержание
  • 1 Обзор
  • 2 Инструменты
    • 2.1 Memcheck
    • 2.2 Другие инструменты
  • 3 Поддерживаемые платформы
  • 4 История и разработка
  • 5 Ограничения Memcheck
  • 6 См. также
  • 7 Примечания
  • 8 Ссылки
  • 9 Внешние ссылки
Обзор

Valgrind по сути является виртуальной машиной, использующей точно в срок (JIT) методы компиляции, включая динамическую перекомпиляцию. Ничто из исходной программы никогда не запускается непосредственно на главном процессоре. Вместо этого Valgrind сначала переводит программу во временную, более простую форму, называемую промежуточным представлением (IR), которая не зависит от процессора и основана на SSA. После преобразования инструмент (см. Ниже) может свободно выполнять любые преобразования, которые он хочет в IR, прежде чем Valgrind переведет IR обратно в машинный код и позволит хост-процессору запустить его. Valgrind перекомпилирует двоичный код для работы на хосте и целевых (или смоделированных) процессорах одной архитектуры. Он также включает заглушку GDB, позволяющую отлаживать целевую программу во время ее работы в Valgrind, с «командами монитора», которые позволяют вам запрашивать у инструмента Valgrind информацию различного рода.

При этих преобразованиях (и обычно коде, который вставляет инструмент) теряется значительная часть производительности; обычно код запускается с помощью Valgrind, а инструмент «none» (который ничего не делает с IR) работает на 20–25% скорости нормальной программы.

Tools

Memcheck

В Valgrind входит несколько инструментов (и несколько внешних). Инструмент по умолчанию (и наиболее часто используемый) - Memcheck. Memcheck вставляет дополнительный код инструментария вокруг почти всех инструкций, который отслеживает правильность (вся нераспределенная память начинается как недействительная или «неопределенная», пока она не будет инициализирована в детерминированное состояние, возможно, из другой памяти) и адресуемость (указывает, указывает ли рассматриваемый адрес памяти на выделенный, не освобожденный блок памяти), хранящиеся в так называемых битах V и A соответственно. Когда данные перемещаются или обрабатываются, инструментальный код отслеживает биты A и V, поэтому они всегда верны на однобитовом уровне.

Кроме того, Memcheck заменяет стандартный распределитель памяти C своей собственной реализацией, которая также включает в себя защиту памяти вокруг всех выделенных блоков (с битами A, установленными в «недействительный»). Эта функция позволяет Memcheck обнаруживать единичные ошибки, когда программа читает или записывает небольшой объем вне выделенного блока. Memcheck может обнаружить и предупредить следующие проблемы:

  • Использование неинициализированной памяти
  • Чтение / запись памяти после того, как она свободна 'd
  • Чтение / запись в конце malloc 'd блоки
  • Утечки памяти

Цена этого - потеря производительности. Программы, работающие под Memcheck, обычно работают в 20–30 раз медленнее, чем за пределами Valgrind, и используют больше памяти (есть штраф памяти за выделение). Таким образом, немногие разработчики постоянно запускают свой код под Memcheck (или любым другим инструментом Valgrind). Чаще всего они используют такие инструменты либо для отслеживания некоторой конкретной ошибки, либо для проверки отсутствия скрытых ошибок (тех, которые может обнаружить Memcheck) в коде.

Другие инструменты

Помимо Memcheck, у Valgrind есть несколько других инструментов:

  • Нет, запускает код на виртуальной машине без выполнения какого-либо анализа и, таким образом, имеет минимально возможный ЦП и память накладные расходы на все инструменты. Поскольку сам valgrind обеспечивает обратную трассировку от segmentation fault, инструмент none обеспечивает эту трассировку с минимальными накладными расходами.
  • Addrcheck, аналогичен Memcheck, но с гораздо меньшими накладными расходами на ЦП и память, таким образом улавливая меньше типов ошибок. Addrcheck был удален в версии 3.2.0.
  • Massif, профилировщик heap . Отдельный GUI massif-visualizer визуализирует вывод Massif.
  • Helgrind и DRD, обнаруживает состояния гонки в многопоточном коде
  • Cachegrind, a кеш профилировщик. Отдельный графический интерфейс KCacheGrind визуализирует вывод из Cachegrind.
  • Callgrind, анализатор callgraph, созданный Йозефом Вайдендорфер, был добавлен в Valgrind с версии 3.2.0. KCacheGrind может визуализировать вывод Callgrind.
  • DHAT, инструмент динамического анализа кучи, который анализирует, сколько памяти выделено и как долго, а также шаблоны использования памяти.
  • exp-sgcheck (с именем exp -ptrcheck до версии 3.7), экспериментальный инструмент для поиска ошибок переполнения стека и глобального массива, которые Memcheck не может найти. Некоторый код приводит к ложным срабатываниям этого инструмента.
  • exp-bbv, симулятор производительности, который экстраполирует производительность из небольшого набора образцов.

Также доступно несколько инструментов внешней разработки. Одним из таких инструментов является 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 является его неспособность обнаруживать все случаи ошибок границ в использование статических данных или данных, размещенных в стеке. Следующий код без проблем передаст инструмент 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
Последняя правка сделана 2021-06-18 08:55:22
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте