Валгринд - Valgrind

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

Валгринд (/ˈvæлɡрɪпd/) это инструмент программирования за отладка памяти, утечка памяти обнаружение и профилирование.

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

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

Обзор

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

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

Инструменты

Memcheck

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

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

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

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

Прочие инструменты

Помимо Memcheck, у Valgrind есть еще несколько инструментов:[7]

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

Также доступно несколько инструментов внешней разработки. Одним из таких инструментов является ThreadSanitizer, еще один детектор условия гонки.[11][12]

Поддерживаемые платформы

Начиная с версии 3.4.0, Valgrind поддерживает Linux на x86, x86-64 и PowerPC. Поддержка для OS X был добавлен в версии 3.5.0.[13] Поддержка Linux на ARMv7 (используется, например, в некоторых смартфоны ) был добавлен в версии 3.6.0.[14] Поддержка для Солярис был добавлен в версии 3.11.0.[3] Существуют неофициальные порты на другие UNIX-подобные платформы (например, FreeBSD,[15] OpenBSD,[16] и NetBSD[17]). Начиная с версии 3.7.0 РУКА /Android добавлена ​​поддержка платформы.[3]

Начиная с версии 3.9.0 появилась поддержка Linux на MIPS64 прямой и большой порядок байтов, для MIPS DSP ASE на MIPS32, для s390x Инструкции с десятичной плавающей запятой для МОЩНОСТЬ8 (Питание ISA 2.07 ) инструкции для Intel AVX2 инструкции для расширений Intel Transactional Synchronization Extensions, RTM и HLE, а также начальная поддержка аппаратной транзакционной памяти на POWER.[2]

История и развитие

Он назван в честь главного входа в Валгалла в Норвежская мифология.[18]

Первоначальный автор Valgrind - Джулиан Сьюард, который в 2006 году выиграл Премия Google-O'Reilly за открытый исходный код за его работу над Valgrind.[19][20]

Несколько других также внесли значительный вклад, в том числе Cerion Armor-Brown, Джереми Фицхардинг, Том Хьюз, Николас Нетеркот, Пол Маккеррас, Дирк Мюллер, Барт Ван Аше, Йозеф Вайдендорфер и Роберт Уолш.[21]

Он используется в ряде проектов на базе Linux.[22]

Ограничения Memcheck

Помимо снижения производительности, важным ограничением Memcheck является его неспособность обнаруживать все случаи ошибок границ при использовании статических данных или данных, размещенных в стеке.[23] Следующий код передаст Memcheck инструмент в Valgrind без происшествий, несмотря на наличие ошибок, описанных в комментариях:

  int Статический[5];    int func(пустота)  {    int Куча[5];      Статический[5] = 0;  / * Ошибка - существует статическое [0] в статическое [4], статическое [5] выходит за пределы * /    Куча [5] = 0;  / * Ошибка - существует стек [0] в стек [4], стек [5] выходит за пределы * /        возвращаться 0;  }

Экспериментальный инструмент valgrind exp-sgcheck был написан для устранения этого ограничения в Memcheck. Он обнаружит ошибки переполнения массива при условии, что первый доступ к массиву находится в границах массива. Обратите внимание, что exp-sgcheck не обнаружит переполнение массива в приведенном выше коде, поскольку первый доступ к массиву находится за пределами границ, но обнаружит ошибку переполнения массива в следующем коде.

  пустота func(пустота)  {    int я, Куча[5];    за (я = 0; я <= 5; я++)        Куча [я] = 0;        / * В пределах для i = 0..4, ошибка за пределами при i = 5 * /  }

Неспособность обнаружить все ошибки, связанные с доступом к данным, выделенным в стеке, особенно примечательна, посколькуопределенные типы ошибок стека сделать программное обеспечение уязвимый к классикеэксплойт разбивания стека.

Смотрите также

Примечания

  1. ^ https://valgrind.org/info/developers.html
  2. ^ а б Новости Valgrind
  3. ^ а б c Примечания к выпуску Valgrind
  4. ^ Домашняя страница Valgrind
  5. ^ Руководство Valgrind
  6. ^ https://valgrind.org/docs/manual/quick-start.html#quick-start.mcrun
  7. ^ Список основных инструментов Valgrind
  8. ^ [1]
  9. ^ раздел об exp-sgcheck в руководстве пользователя Valgrind
  10. ^ [2]
  11. ^ https://valgrind.org/downloads/variants.html
  12. ^ К Серебряный, Т. Исходжанов, ThreadSanitizer - обнаружение гонки данных на практике, Труды семинара по бинарным инструментам и приложениям WBIA'09
  13. ^ Порт OS X
  14. ^ ARM / Linux порт
  15. ^ Порт Valgrind FreeBSD
  16. ^ Порт Valgrind OpenBSD
  17. ^ "Порт Valgrind NetBSD". Архивировано из оригинал на 2006-02-09. Получено 2006-01-28.
  18. ^ Valgrind FAQ
  19. ^ Список наград valgrind.org
  20. ^ Награды Google-O'Reilly Open Source Awards - Зал славы
  21. ^ Разработчики Valgrind
  22. ^ Список пользователей valgrind.org
  23. ^ Valgrind FAQ

Рекомендации

внешняя ссылка