Как работает валгринд?

80

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

экстраее
источник

Ответы:

106

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

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

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

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

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

джеддинги
источник
3
Эта статья Джулиана Сьюарда немного расширяет дизайн Valgrind: курсы.cs.washington.edu
courses/
34

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 фаз Valgrind

Ашок Вайраван
источник
не могли бы вы сообщить мне источник этой информации или любую ссылку, содержащую эти сведения? Благодарю.
mezda
4

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

Янтарь
источник
2

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

Чарльз Сальвия
источник