Jak działa Valgrind?

80

Czy ktoś może szybko wyjaśnić, jak działa Valgrind? Przykład: skąd wie, kiedy pamięć jest przydzielana i zwalniana?

extraeee
źródło

Odpowiedzi:

106

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.

jheddings
źródło
3
Ten artykuł Julian Seward rozszerza nieco na projektowaniu Valgrind: courses.cs.washington.edu/courses/cse326/05wi/valgrind-doc/...
user11171
34

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

  1. Memcheck - dynamicznie śledzi alokację pamięci i raportuje wycieki pamięci.
  2. Helgrind - wykrywa i zgłasza martwe blokady, potencjalne wyścigi danych i odwrócenie blokad.
  3. Cachegrind - symuluje sposób interakcji aplikacji z pamięcią podręczną systemu i dostarcza informacji o chybieniach pamięci podręcznej.
  4. Nulgrind - prosty valgrind, który nigdy nie przeprowadza żadnej analizy. Używany przez programistów do testów wydajności.
  5. Masyw - narzędzie do analizy wykorzystania pamięci sterty aplikacji.

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 Tool = Valgrind Core + Tool Plugin

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:

8 faz Valgrind

Ashok Vairavan
źródło
czy możesz podać źródło tych informacji lub jakikolwiek link zawierający te informacje? dzięki.
mezda
4

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).

Bursztyn
źródło
2

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.

Charles Salvia
źródło