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

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

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

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

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

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

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

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

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

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

Valgrind Tool = Valgrind Core + Tool Plugin 

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

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

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

8 фаз Valgrind

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

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

Здесь вы можете найти приятную информацию:

Кроме того, ознакомьтесь с LD_PRELOAD.

Interesting Posts

Как я могу запретить пользователю закрывать мое приложение C #?

Альтернатива вектору

Почему некоторые веб-сайты отображают название компании рядом с URL-адресом?

В чем основное различие между поколениями процессоров Intel?

Laravel – Route :: resource vs Route :: controller

Порядок сериализованных полей с использованием JSON.NET

Сортировка 2D-массива в C ++ с использованием встроенных функций (или любого другого метода)?

android studio 0.4.2: Ошибка синхронизации с ошибкой проекта Gradle

Для OS X, решения резервного копирования, которые работают так же, как Time Machine?

Внедрение HWND во внешний процесс с использованием SetParent

Как заменить все вхождения символа в строке?

Как я смогу сделать VHD-установку Windows 8 из Windows 7

Восстановление файла Excel

почему имя массива является указателем на первый элемент массива?

Как мой домашний сервер может принимать и отвечать на соединения из Интернета при запуске клиента OpenVPN?

Давайте будем гением компьютера.