Как работает valgrind? - PullRequest
       15

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

75 голосов
/ 01 ноября 2009

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

Ответы [ 5 ]

97 голосов
/ 01 ноября 2009

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

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

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

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

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

30 голосов
/ 09 декабря 2014

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

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

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

             Valgrind Tool = Valgrind Core + Tool Plugin

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

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

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

8 phases of Valgrind

4 голосов
/ 01 ноября 2009

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

2 голосов
/ 14 сентября 2013

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

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

2 голосов
/ 01 ноября 2009

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

...