Jump to content

Избирательные ворота

Оригинальный автор(ы) Джулиан Сьюард , Николас Незеркот [1]
Разработчик(и) Команда разработчиков Валгринд [2]
Первоначальный выпуск 27 июля 2002 г. [3]
Стабильная версия 3.23.0 (26 апреля 2024 г .; 54 дня назад ( 26.04.2024 ) ) [±] [4]
Репозиторий
Написано в С
Операционная система Линукс
FreeBSD
Солярис
Андроид [5]
Тип Профилировщик , отладчик памяти
Лицензия Стандартная общественная лицензия GNU
Веб-сайт www .valgrind .org

Валгринд ( / ˈ 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[]
    • размер освобождения не совпадает с размером выделения
    • выровненное освобождение — это не то же самое выравнивание, что и выделение
  • Использование неправильного выравнивания
  • Использование 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;
  }


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

См. также [ править ]

Примечания [ править ]

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

Ссылки [ править ]

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 0016db6a643be89c8fab50a9fa9927e2__1718773860
URL1:https://arc.ask3.ru/arc/aa/00/e2/0016db6a643be89c8fab50a9fa9927e2.html
Заголовок, (Title) документа по адресу, URL1:
Valgrind - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)