Хтось може дати коротке пояснення на найвищому рівні про те, як працює Valgrind? Приклад: звідки він знає, коли пам’ять виділяється та звільняється?
Відповіді:
В основному Valgrind запускає ваш додаток у "пісочниці". Під час роботи в цій пісочниці він може вставити власні вказівки щодо розширеного налагодження та профілювання.
З посібника:
Потім ваша програма запускається на синтетичному процесорі, що надається ядром Valgrind. Оскільки новий код виконується вперше, ядро передає код вибраному інструменту. Інструмент додає до цього власний код інструментарію і передає результат назад до ядра, яке координує подальше виконання цього інструментального коду.
Отже, в основному valgrind надає віртуальний процесор, який виконує вашу програму. Однак перед тим, як інструкції з вашої програми обробляються, вони передаються інструментам (наприклад, memcheck). Ці інструменти схожі на плагіни, і вони можуть модифікувати вашу програму до її запуску на процесорі.
Чудова річ цього підходу полягає в тому, що вам не потрібно взагалі змінювати або перезв’язувати свою програму, щоб запускати її у valgrind. Це призводить до того, що ваша програма працює повільніше, однак valgrind не призначена для вимірювання продуктивності або запуску під час нормального виконання програми, тому насправді це не проблема.
Valgrind - це інструмент динамічного двійкового аналізу (DPA), який використовує систему динамічного двійкового приладобудування (DPI) для перевірки розподілу пам'яті, виявлення тупикових ситуацій та профілювання програм. DPI Framework має власний менеджер пам'яті низького рівня, планувальник, обробник потоків та обробник сигналів. Набір інструментів Valgrind включає такі інструменти, як
Інструмент Valgrind використовує механізм розбирання та пересинтезу, де завантажує програму в процес, розбирає код програми, додає код інструментарію для аналізу, збирає його назад і виконує програму. Він використовує Just Intime Compiler (JIT) для вбудовування програми з кодом приладів.
Valgrind Tool = Valgrind Core + Tool Plugin
Valgrind Core розбирає код програми та передає фрагмент коду плагіну інструменту для контрольно-вимірювальних приладів. Плагін інструменту додає код аналізу та збирає його назад. Таким чином, Valgrind забезпечує гнучкість написання нашого власного інструменту поверх фреймворку Valgrind. Valgrind використовує тіньові регістри та тіньову пам'ять для інструментарію інструкцій зчитування / запису, читання / запису системних викликів, розподілу стека та купи.
Valgrind надає обгортки навколо системного виклику та реєстри для попереднього та після зворотного викликів для кожного системного виклику для відстеження пам'яті, до якої здійснюється доступ як частина системного виклику. Таким чином, Valgrind - це рівень абстракції ОС між операційною системою Linux та клієнтським додатком.
Діаграма ілюструє 8 фаз Valgrind:
valgrind сидить як шар між вашою програмою та ОС, перехоплюючи виклики до ОС, вимагаючи виділення пам'яті (де) та записуючи те, чим маніпулюють, а потім фактично виділяючи пам'ять та передаючи назад еквівалент. По суті, це те, як працює більшість профайлерів коду, за винятком набагато нижчого рівня (системні виклики замість викликів функцій програми).
Тут ви можете знайти приємну інформацію:
Окрім того, ознайомтесь із LD_PRELOAD.
Valgrind - це в основному віртуальна машина, яка виконує вашу програму. Це віртуальна архітектура, яка перехоплює кожен виклик для виділення / звільнення пам'яті.