Подтвердить что ты не робот

Как работает valgrind?

Может ли кто-нибудь дать краткое объяснение того, как работает Valgrind? Пример: как он узнает, когда выделена и освобождена память?

4b9b3361

Ответ 1

Valgrind в основном запускает ваше приложение в "песочнице". Во время работы в этой изолированной среде он может вставлять свои собственные инструкции для выполнения расширенной отладки и профилирования.

Из руководства:

Ваша программа затем запускается на синтетическом процессоре, обеспечиваемом ядром Valgrind. Когда новый код выполняется в первый раз, ядро ​​передает код выбранному инструменту. Инструмент добавляет к этому свой собственный код инструментария и передает результат обратно в ядро, которое координирует дальнейшее выполнение этого инструментального кода.

Таким образом, valgrind предоставляет виртуальный процессор, который выполняет ваше приложение. Однако перед обработкой ваших инструкций приложения они передаются в инструменты (например, memcheck). Эти инструменты вроде как плагины, и они могут модифицировать ваше приложение до его запуска на процессоре.

Самое замечательное в этом подходе заключается в том, что вам не нужно модифицировать или повторно использовать вашу программу, чтобы запустить ее в valgrind. Это заставляет вашу программу работать медленнее, однако valgrind не предназначен для измерения производительности или выполнения во время обычного выполнения вашего приложения, поэтому это не проблема.

Ответ 2

Valgrind - это инструмент динамического двоичного анализа (DPA), который использует инфраструктуру динамического двоичного инструментария (DPI) для проверки распределения памяти, обнаружения взаимоблокировок и профилирования приложений. Платформа DPI имеет собственный менеджер памяти низкого уровня, планировщик, обработчик потока и обработчик сигналов. Набор инструментов Valgrind включает инструмент, например

  • Memcheck - отслеживает распределение памяти динамически и сообщает о утечках памяти.
  • Helgrind - обнаруживает и сообщает о мертвых блокировках, потенциальных гонках данных и блокировках.
  • Cachegrind - имитирует взаимодействие приложения с системным кешем и предоставляет информацию о промахах в кэше.
  • Nulgrind - простой valgrind, который никогда не анализирует. Используется разработчиками для тестирования производительности.
  • Massif - инструмент для анализа использования памяти кучи приложения.

Инструмент Valgrind использует механизм дизассемблирования и resynthesize, где он загружает приложение в процесс, дизассемблирует код приложения, добавляет контрольный код для анализа, собирает его и выполняет приложение. Он использует компилятор Just Intime (JIT) для встраивания приложения с кодом инструментария.

             Valgrind Tool = Valgrind Core + Tool Plugin

Valgrind Core дизассемблирует код приложения и передает фрагмент кода в плагин инструмента для инструментария. Плагин инструментов добавляет код анализа и собирает его обратно. Таким образом, Valgrind обеспечивает гибкость для написания собственного инструмента поверх структуры Valgrind. Valgrind использует теневые регистры и теневую память для инструкций чтения/записи инструмента, системного вызова чтения/записи, распределения стека и кучи.

Valgrind предоставляет обертки вокруг системного вызова и регистров для предварительных и пост-обратных вызовов для каждого системного вызова для отслеживания доступа к памяти в качестве части системного вызова. Таким образом, Valgrind - это уровень абстракции ОС между операционной системой Linux и клиентским приложением.

Диаграмма иллюстрирует 8 фаз Valgrind:

8 phases of Valgrind

Ответ 3

valgrind находится в качестве слоя между вашей программой и ОС, перехватывая вызовы в ОС, запрашивающие выделение памяти (де) и записывая то, что обрабатывается, а затем фактически распределяет память и передает эквивалент. По сути, большинство профайлов кода работают, за исключением гораздо более низкого уровня (системные вызовы вместо вызовов программных функций).

Ответ 4

Valgrind - это в основном виртуальная машина, которая выполняет вашу программу. Это виртуальная архитектура, которая перехватывает каждый вызов для выделения/свободной памяти.