Blog (35)
Komentarze (574)
Recenzje (0)

Wszystko szczelne, czyli wykrywamy wycieki do pamięci w aplikacji C++ w systemach Microsoft Windows

@biomenWszystko szczelne, czyli wykrywamy wycieki do pamięci w aplikacji C++ w systemach Microsoft Windows02.04.2017 19:32

Praca z językiem C/C++ daje spore możliwości w kwestii alokowania pamięci. Niestety, jak to zawsze w życiu bywa, w parze z dużą władzą idzie również spora odpowiedzialność. Najlepszą praktyką unikania błędów jest pisanie kodu, który ich nie zawiera – oczywiście jest to czysty truizm gdyż nie myli się ten kto nic nie robi. Pozostaje więc pytanie: jak żyć z alokowaniem pamięci na stercie?

W systemach GNU/Linuks programista ma do swojej dyspozycji wygodne i popularne narzędzie: Valgrind. Aplikacja ta doczekała się bezpośredniej integracji z QtCreatorem przez co atrakcyjność tego rozwiązania jest, w moich oczach, dość wysoka. Problem pojawia się gdy chcemy wykrywać przecieki do pamięci, na systemie firmy Microsoft. Valgrind jest niestety, projektem na wyłączność dla środowisk Uniksowych. W tym miejscu jako pierwsze rozwiązanie można by zaproponować: użycie Visual Studio z dedykowanym kompilatorem C++ i narzędziami do analizy pamięci. Wiąże się jednak to z pewnymi niedogodnościami. Osobiście preferuje QtCreator ze względu na jego niską konsumpcje pamięci operacyjnej w stosunku do IDE Microsoftu. Oczywiście, z każdą wersją kompilatora, Microsoft sprawa że jego narzędzie jest doskonalsze aczkolwiek niesmak wywołała u mnie informacja że dopiero w wersji 2017, kompilator Visual C++ doczekał się pełnego wsparcia dla standardu C++11/14. Dlatego mimowolnie korzystam z MinGW. Pozostaje więc pytanie, dlaczego nie pozostać przy pracy w środowisku Linuksowym? Odpowiedź jest bardzo prosta: system zarządzania zależnościami wersji bibliotek na pingwinie jest równie ułomny co wsparcie wcześniejszych wersji kompilatora Microsoftu dla standardu C++11/14. Nie kupuje konceptu bibliotek współdzielonych i tyle. Niby można z tym żyć, kombinować ze ściezkami bibliotek itp. ale wydaje mi się że warto poszukać lepszego rozwiązania.

We wcześniejszym akapicie nakreśliłem motywy jakimi kierowałem się przy wyborze narzędzi. Bez odpowiedzi pozostaje w dalszym ciągu pytanie, jak tropić wycieki do pamięci debugując aplikację na Windowsie, wykorzystując do pracy QtCreator/MinGW? Rozwiązaniem naszych problemów będzie Dr.Memory. Jest to w dużym uproszczeniu debuger pamięci dostępny na wszystkich platformach. Na stronie projektu możemy znaleźć wykres dotyczący zysku wydajności jaki przynosi nam korzystanie z Dr.Memory w stosunku do wcześniej wspomnianego Valgrinda. Osobiście nie przeprowadzałem żadnych pomiarów przez co zostaje mi wierzyć (ze stosowną dozą sceptycyzmu) że faktycznie tak jest.

Przykład

Jako że pewne rzeczy najłatwiej zrozumieć na prostym przykładzie, załóżmy że mamy taki kod:


struct PersonInfo
{
    int age;
    std::string name;
    std::string secondName;
};

void createMemoryLeak()
{
    PersonInfo* newPerson = new PersonInfo();
}

int main(int argc, char *argv[])
{
    createMemoryLeak();
    createMemoryLeak();
    createMemoryLeak();
    return 0;
}

Oczywiście celowo popełniono w nim zbrodnie nie zawołania operatora delete dla obiektu newPerson. Aby z korzystać z pełni dobrodziejstw programu Dr.Memory, naszą aplikację powinniśmy zbudować w trybie Debug. Mając zbudowany przykład mamy dwie możliwości, pierwsza to przeciągnąć plik wykonywalny .exe na ikonkę Dr.Memory jaka pojawiła się na pulpicie po instalacji aplikacji lub też otworzyć wiersz poleceń i przejść do katalogu gdzie mieści się nasz plik wykonywalny. Proponowałbym zastosować tą drugą opcje ze względu na to że będziemy mieli łatwiejszy dostęp do stosowania flag programu. Będąc w katalogu z naszym plikiem wykonywalnym, wpisujemy do wiersza poleceń komendę:

 drmemory.exe ./MemTest.exe 

I viola. Stała się magia. Aplikacja domyślnie przy instalacji, "dodaje się" do zmiennych środowiskowych systemu przez co problemów z wywołaniem z terminala, nie powinno być problemów. Przykładowy zrzut ekranu prezentuje poniżej działanie debugera pamięci.

Program wyrzucił nam zarówno w konsoli jak i w postaci pliku tekstowego, raport o tym jakie błędy znalazł. Tak samo jak w przypadku Valgrinda, mamy do dyspozycji informację w których miejscach naszego kodu wystąpił potencjalny problem.

Słowem podsumwania

Wpis był co prawda krótki aczkolwiek myślę że poruszał dość istotną kwestię. Bolączką rozwiązania jest fakt że nie istnieje żadna integracja z wykorzystywanym przeze mnie IDE. W ogólnym rozrachunku, korzystanie z Dr.Memory jest sytuacją Win-Win. Nie uzależniamy się od żadnego systemu operacyjnego czy też kompilatora, dzięki czemu możemy elastycznie krążyć między platformami z zachowaniem pewności że na każdej z nich znajdziemy narzędzie które ułatwi naszą pracę.

Zachęcam do przetestowania samemu powyżej przedstawionego rozwiązania.

Szanowna Użytkowniczko! Szanowny Użytkowniku!
×
Aby dalej móc dostarczać coraz lepsze materiały redakcyjne i udostępniać coraz lepsze usługi, potrzebujemy zgody na dopasowanie treści marketingowych do Twojego zachowania. Twoje dane są u nas bezpieczne, a zgodę możesz wycofać w każdej chwili na podstronie polityka prywatności.

Kliknij "PRZECHODZĘ DO SERWISU" lub na symbol "X" w górnym rogu tej planszy, jeżeli zgadzasz się na przetwarzanie przez Wirtualną Polskę i naszych Zaufanych Partnerów Twoich danych osobowych, zbieranych w ramach korzystania przez Ciebie z usług, portali i serwisów internetowych Wirtualnej Polski (w tym danych zapisywanych w plikach cookies) w celach marketingowych realizowanych na zlecenie naszych Zaufanych Partnerów. Jeśli nie zgadzasz się na przetwarzanie Twoich danych osobowych skorzystaj z ustawień w polityce prywatności. Zgoda jest dobrowolna i możesz ją w dowolnym momencie wycofać zmieniając ustawienia w polityce prywatności (w której znajdziesz odpowiedzi na wszystkie pytania związane z przetwarzaniem Twoich danych osobowych).

Od 25 maja 2018 roku obowiązuje Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 (określane jako "RODO"). W związku z tym chcielibyśmy poinformować o przetwarzaniu Twoich danych oraz zasadach, na jakich odbywa się to po dniu 25 maja 2018 roku.

Kto będzie administratorem Twoich danych?

Administratorami Twoich danych będzie Wirtualna Polska Media Spółka Akcyjna z siedzibą w Warszawie, oraz pozostałe spółki z grupy Wirtualna Polska, jak również nasi Zaufani Partnerzy, z którymi stale współpracujemy. Szczegółowe informacje dotyczące administratorów znajdują się w polityce prywatności.

O jakich danych mówimy?

Chodzi o dane osobowe, które są zbierane w ramach korzystania przez Ciebie z naszych usług, portali i serwisów internetowych udostępnianych przez Wirtualną Polskę, w tym zapisywanych w plikach cookies, które są instalowane na naszych stronach przez Wirtualną Polskę oraz naszych Zaufanych Partnerów.

Dlaczego chcemy przetwarzać Twoje dane?

Przetwarzamy je dostarczać coraz lepsze materiały redakcyjne, dopasować ich tematykę do Twoich zainteresowań, tworzyć portale i serwisy internetowe, z których będziesz korzystać z przyjemnością, zapewniać większe bezpieczeństwo usług, udoskonalać nasze usługi i maksymalnie dopasować je do Twoich zainteresowań, pokazywać reklamy dopasowane do Twoich potrzeb. Szczegółowe informacje dotyczące celów przetwarzania Twoich danych znajdują się w polityce prywatności.

Komu możemy przekazać dane?

Twoje dane możemy przekazywać podmiotom przetwarzającym je na nasze zlecenie oraz podmiotom uprawnionym do uzyskania danych na podstawie obowiązującego prawa – oczywiście tylko, gdy wystąpią z żądaniem w oparciu o stosowną podstawę prawną.

Jakie masz prawa w stosunku do Twoich danych?

Masz prawo żądania dostępu, sprostowania, usunięcia lub ograniczenia przetwarzania danych. Możesz wycofać zgodę na przetwarzanie, zgłosić sprzeciw oraz skorzystać z innych praw wymienionych szczegółowo w polityce prywatności.

Jakie są podstawy prawne przetwarzania Twoich danych?

Podstawą prawną przetwarzania Twoich danych w celu świadczenia usług jest niezbędność do wykonania umów o ich świadczenie (tymi umowami są zazwyczaj regulaminy). Podstawą prawną przetwarzania danych w celu pomiarów statystycznych i marketingu własnego administratorów jest tzw. uzasadniony interes administratora. Przetwarzanie Twoich danych w celach marketingowych realizowanych przez Wirtualną Polskę na zlecenie Zaufanych Partnerów i bezpośrednio przez Zaufanych Partnerów będzie odbywać się na podstawie Twojej dobrowolnej zgody.