Czy ktoś może szybko wyjaśnić, jak działa Valgrind? Przykład: skąd wie, kiedy pamięć jest przydzielana i zwalniana?
Valgrind zasadniczo uruchamia Twoją aplikację w „piaskownicy”. Działając w tej piaskownicy, może wstawiać własne instrukcje dotyczące zaawansowanego debugowania i profilowania.
Z instrukcji:
Twój program jest następnie uruchamiany na syntetycznym procesorze dostarczanym przez rdzeń Valgrind. Gdy nowy kod jest wykonywany po raz pierwszy, rdzeń przekazuje kod do wybranego narzędzia. Narzędzie dodaje do tego własny kod instrumentacji i przekazuje wynik z powrotem do rdzenia, który koordynuje dalsze wykonywanie tego oprzyrządowanego kodu.
Zasadniczo valgrind zapewnia procesor wirtualny, który wykonuje Twoją aplikację. Jednak przed przetworzeniem instrukcji aplikacji są one przekazywane do narzędzi (takich jak memcheck). Te narzędzia są czymś w rodzaju wtyczek i są w stanie zmodyfikować aplikację, zanim zostanie uruchomiona na procesorze.
Wspaniałą rzeczą w tym podejściu jest to, że nie musisz w ogóle modyfikować ani ponownie łączyć swojego programu, aby uruchomić go w valgrind. Powoduje to wolniejsze działanie programu, jednak valgrind nie jest przeznaczony do mierzenia wydajności ani uruchamiania podczas normalnego wykonywania aplikacji, więc tak naprawdę nie stanowi to problemu.
Valgrind to narzędzie do dynamicznej analizy binarnej (DPA), które wykorzystuje strukturę Dynamic Binary Instrumentation (DPI) do sprawdzania alokacji pamięci, wykrywania zakleszczeń i profilowania aplikacji. Struktura DPI ma własnego menedżera pamięci niskiego poziomu, harmonogramu, obsługi wątków i obsługi sygnałów. Zestaw narzędzi Valgrind zawiera narzędzia takie jak
Narzędzie Valgrind wykorzystuje mechanizm deasemblacji i ponownej syntezy, w którym ładuje aplikację do procesu, dezasembluje kod aplikacji, dodaje kod instrumentacji do analizy, składa go z powrotem i wykonuje aplikację. Wykorzystuje Just Intime Compiler (JIT) do osadzenia aplikacji z kodem instrumentacji.
Valgrind Core deasembluje kod aplikacji i przekazuje fragment kodu do wtyczki narzędziowej w celu instrumentacji. Wtyczka narzędziowa dodaje kod analizy i składa go z powrotem. W ten sposób Valgrind zapewnia elastyczność pisania własnego narzędzia w oparciu o framework Valgrind. Valgrind używa rejestrów-cienia i pamięci-cienia do instrumentów odczytu / zapisu instrukcji, odczytu / zapisu wywołań systemowych, alokacji stosu i sterty.
Valgrind zapewnia otoki wokół wywołania systemowego i rejestruje wywołania zwrotne przed i po każdym wywołaniu systemowym, aby śledzić dostępną pamięć w ramach wywołania systemowego. Dlatego Valgrind jest warstwą abstrakcji systemu operacyjnego między systemem operacyjnym Linux a aplikacją kliencką.
Diagram ilustruje 8 faz Valgrind:
źródło
valgrind jest warstwą między twoim programem a systemem operacyjnym, przechwytując wywołania systemu operacyjnego żądające (de) alokacji pamięci i rejestrujące to, co jest manipulowane, zanim faktycznie przydzieli pamięć i przekaże jej odpowiednik. Zasadniczo jest to sposób działania większości profilerów kodu, z wyjątkiem znacznie niższego poziomu (wywołania systemowe zamiast wywołań funkcji programu).
źródło
Tutaj możesz znaleźć kilka ciekawych informacji:
Poza tym zapoznaj się z LD_PRELOAD.
źródło
Valgrind to w zasadzie maszyna wirtualna, która wykonuje twój program. Jest to wirtualna architektura, która przechwytuje każde wywołanie w celu przydzielenia / zwolnienia pamięci.
źródło