Может ли кто-нибудь дать краткое объяснение того, как работает Valgrind? Пример: как он узнает, когда выделена и освобождена память?
Как работает valgrind?
Ответ 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:
Ответ 3
valgrind находится в качестве слоя между вашей программой и ОС, перехватывая вызовы в ОС, запрашивающие выделение памяти (де) и записывая то, что обрабатывается, а затем фактически распределяет память и передает эквивалент. По сути, большинство профайлов кода работают, за исключением гораздо более низкого уровня (системные вызовы вместо вызовов программных функций).
Ответ 4
Valgrind - это в основном виртуальная машина, которая выполняет вашу программу. Это виртуальная архитектура, которая перехватывает каждый вызов для выделения/свободной памяти.
Ответ 5
Здесь вы можете найти приятную информацию:
- Valgrind: основа для высокопроизводительного динамического двоичного инструментария
- http://valgrind.org/docs/manual/manual-core-adv.html#manual-core-adv.wrapping
Кроме того, ознакомьтесь с LD_PRELOAD.