2009-11-01 2 views
70

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

ответ

90

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

Из инструкции:

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

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

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

+2

В этой статье Джулиан Seward расширяется немного от конструкции Valgrind: http://courses.cs.washington.edu/courses/cse326 /05wi/valgrind-doc/mc_techdocs.html – user11171

3

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

2

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

23

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

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

+0

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

+1

Здесь вы идете .. http://valgrind.org/docs/valgrind2007.pdf –

Смежные вопросы