stringtranslate.com

Валгринд

Valgrind ( / ˈ 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 своей собственной реализацией, которая также включает в себя защиту памяти вокруг всех выделенных блоков (с битами A, установленными в «недействительные»). Эта функция позволяет Memcheck обнаруживать ошибки с отклонением на единицу , когда программа читает или записывает данные за пределы выделенного блока на небольшую величину. Проблемы, которые Memcheck может обнаружить и предупредить, включают следующее:

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

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

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

exp-sgcheck ( до версии 3.7 называвшийся exp-ptrcheck ) был удален в версии 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. Существуют неофициальные порты на другие Unix-подобные платформы (например , OpenBSD , [16] и NetBSD [17] ). С версии 3.7.0 добавлена ​​поддержка платформы ARM/ Android . [5]

Начиная с версии 3.9.0 имеется поддержка Linux на MIPS64 с прямым и прямым порядком байтов, для MIPS DSP ASE на MIPS32 , для инструкций с десятичной плавающей запятой s390x , для инструкций POWER8 ( Power ISA 2.07 ), для инструкций Intel AVX2 , для расширений синхронизации транзакций Intel. , как RTM, так и HLE, а также начальную поддержку аппаратной транзакционной памяти на POWER. [4]

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

Название Валгринд является отсылкой к главному входу в Валгаллу из скандинавской мифологии . [18] [19] Во время разработки (до релиза) проект назывался Heimdall ; однако это имя противоречило бы пакету безопасности.

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

Несколько других также внесли значительный вклад, в том числе Николас Нетеркот, Барт Ван Аш, Флориан Кром, Том Хьюз, Филипп Варокье, Марк Вилаард, Пол Флойд, Петар Йованович, Карл Лав, Церион Армор-Браун и Иво Райср. [22]

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

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

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

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


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

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

Примечания

  1. ^ "АВТОРЫ". valgrind.org . Проверено 19 сентября 2022 г.
  2. ^ «Валгринд: Разработчики».
  3. ^ «Двадцать лет Валгринда» . Проверено 4 августа 2023 г.
  4. ^ ab Valgrind Новости
  5. ^ примечания к выпуску abc Valgrind
  6. ^ "Валгринд". valgrind.org . Проверено 4 мая 2023 г.
  7. ^ Домашняя страница Валгринда
  8. ^ Руководство Валгринд
  9. ^ "Валгринд".
  10. ^ Основной список инструментов Valgrind
  11. ^ "Валгринд".
  12. ^ «Валгринд: Варианты / Патчи» .
  13. ^ К. Серебряный, Т. Исходжанов, ThreadSanitizer – обнаружение гонок данных на практике , Материалы семинара по двоичному инструментированию и приложениям WBIA'09
  14. ^ Порт ARM/Linux
  15. ^ Порт OS X
  16. ^ Порт Valgrind OpenBSD
  17. ^ "Порт Valgrind NetBSD" . Архивировано из оригинала 9 февраля 2006 г. Проверено 28 января 2006 г.
  18. ^ Часто задаваемые вопросы о Валгринде
  19. ^ "Гримнисмал". Völuspá.org .
  20. ^ список наград valgrind.org.
  21. ^ Google-O'Reilly Open Source Awards - Зал славы
  22. ^ Разработчики Valgrind
  23. ^ список пользователей valgrind.org
  24. ^ Часто задаваемые вопросы о Валгринде

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

Внешние ссылки