RATIONAL PURIFY przygotował: Krzysztof Jurczuk Politechnika Białostocka Wydział Informatyki Katedra Oprogramowania ul. Wiejska 45A Białystok

Podobne dokumenty
Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

ZASADY PROGRAMOWANIA KOMPUTERÓW

NETBEANS PROFILER TOMASZ ŁUKASZUK

CODE::BLOCKS & VALGRIND OPRACOWAŁ MICHAŁ BETHKE

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Zadania: 1. Funkcja przeliczająca F na C: float FtoC(float f){ return (f 32.0) * 5.0 / 9.0; }

MS Visual Studio 2005 Team Suite - Performance Tool

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Języki i techniki programowania Ćwiczenia 2

Laboratorium Informatyka (I) AiR Ćwiczenia z debugowania

Podstawy programowania komputerów

2. W oknie dialogowym Choose Toolbox Items w zakładce.net Framework Components naciskamy przycisk Browse...

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

Programowanie Systemów Czasu Rzeczywistego

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

#include "stdafx.h" #include <iostream> #include "windows.h" using namespace std;

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Adam Kotynia, Łukasz Kowalczyk

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

GNU GProf i GCov. przygotował: Krzysztof Jurczuk Politechnika Białostocka Wydział Informatyki Katedra Oprogramowania ul. Wiejska 45A Białystok

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

Programowanie w języku C++

Testowanie I. Celem zajęć jest zapoznanie studentów z podstawami testowania ze szczególnym uwzględnieniem testowania jednostkowego.

Niech wynik od 0 do 200F wyświetla w trzech kolumnach: F = (wartość) C = (wyliczona wartość) K = (wyliczona wartość)

Jak Windows zarządza pamięcią?

Tworzenie oprogramowania

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Załącznik 1 instrukcje instalacji

Wskaźniki. Informatyka

DYNAMICZNE PRZYDZIELANIE PAMIECI

C++ - [1-3] Debugowanie w Qt Creator

Dokumentacja programu. Zoz. Uzupełnianie kodów terytorialnych w danych osobowych związanych z deklaracjami POZ. Wersja

I - Microsoft Visual Studio C++

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

JAK DZIAŁAJĄ FUNKCJE PODZIAŁ PAMIĘCI

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 8. Karol Tarnowski A-1 p.

Wykład 1: Wskaźniki i zmienne dynamiczne

Programowanie niskopoziomowe

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

1 Podstawy c++ w pigułce.

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

1.Wstęp. 2.Generowanie systemu w EDK

it = 0; memset((void *)ptr, 0, items*sizeof(double)); cout << "Konstruktor sparametryzowany " << title << " adres: " << ptr << "\n";

Podstawy programowania skrót z wykładów:

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Programowanie obiektowe

CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Wprowadzenie do środowiska Qt Creator

Testowanie II. Celem zajęć jest zapoznanie studentów z oceną jakości testów przy wykorzystaniu metryk pokrycia kodu testami (ang. code coverage).

Jak napisać listę jednokierunkową?

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

Instrukcja dotycząca konwersji dokumentów LaTeX do plików w formacie RTF

Wykład 8: klasy cz. 4

Tworzenie i wykorzystanie usług sieciowych

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

zmienne stanowią abstrakcję komórek pamięci: programista może przechowywać dane w pamięci, nie martwiąc się o techniczne szczegóły (np.

Informatyka. Wy-08 Klasy. mgr inż. Krzysztof Kołodziejczyk

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Użytkowanie PortableGit w systemie Windows. 1. Najważniejsze informacje

Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:

Wprowadzenie do Valgrinda

Wstęp do programowania

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Programowanie obiektowe W3

Utworzenie pliku. Dowiesz się:

Przewodnik użytkownika (instrukcja) AutoMagicTest

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

Wstęp do programowania. Wykład 1

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Rozdział 4 KLASY, OBIEKTY, METODY

Programowanie w Javie

- - Ocena wykonaniu zad3. Brak zad3

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Tworzenie projektu asemblerowego dla środowiska Visual Studio 2008.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

MATERIAŁY - udostępnianie materiałów dydaktycznych w sieci SGH

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

kiedy znowu uzyska sterowanie, to podejmuje obliczenie od miejsca, w którym poprzednio przerwała, i z dotychczasowymi wartościami zmiennych,

Podstawy programowania obiektowego

Zadanie 2: Arytmetyka symboli

KURS C/C++ WYKŁAD 6. Wskaźniki

Polityka bezpieczeństwa.

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Zaawansowane programowanie w języku C++ Programowanie obiektowe

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Transkrypt:

RATIONAL PURIFY przygotował: Krzysztof Jurczuk Politechnika Białostocka Wydział Informatyki Katedra Oprogramowania ul. Wiejska 45A 15-351 Białystok STRESZCZENIE: Dokument przestawia podstawową funkcjonalność narzędzia IBM Rational Purify. Omawia problem analizy czasu wykonania oraz przedstawia możliwości prezentowanego narzędzia. Prezentuje także użycie Rational Purify przy pracy z kodem napisany w C++ i JAVA oraz z kodem zarządzanym platformy.net. Porusza także wewnętrzną zasadę działania przedstawianego oprogramowania. 1. WPROWDZENIE Rational Purify jest narzędziem wspomagającym proces tworzenia oprogramowania. Pozwala na wczesne i łatwe wykrywanie błędów kompilacji oraz "wycieków pamięci" (ang. memory leaks). Pozwala to na odpowiednio wczesne wykrycie nieporządnych błędów w oprogramowaniu, co pozwala na szybszą oraz bardziej niezawodną pracę zespołów programistycznych. Błędy kompilacji i "wycieki pamięci" są jednymi z najbardziej trudnych błędów do wykrycia. Skutki jakie mogą powodować są trudne do przewidzenia. Poza tym nie zawsze musimy na nie trafić podczas każdego uruchomienia aplikacji. Bardzo często pozostają nieodkryte przez długi czas działa oprogramowania. Dlatego też bardzo ważnym elementem podczas tworzenia aplikacji jest korzystanie z narzędzi wspomagających proces detekcji błędów, szczególnie błędów wykonania (ang., runtime analysis). Rational Purify umożliwia między innymi: szybkie i wszechstronne wyszukiwanie błędów czasu wykonania detekcje błędów bez posiadania kodu źródłowego wraz z użyciem narzędzia IBM Rational PureCoverage określenie miejsc w kodzie, które nie zostały przetestowane 2. BŁĘDY WYKRYWANE PRZEZ RATIONAL PURIFY Rational Purify pozwala wykryć między innymi następujące błędy: Array Bounds Read ABR czytanie z pamięci spoza zakresu tablicy Array Bounds Write ABW pisanie do pamięci spoza zakresu tablicy Beyond Stack Read BSR czytanie powyżej bieżącego wskaźnika stosu Beyond Stack Write BSW pisanie powyżej bieżącego wskaźnika stosu Freeing Freed Memory FFM próba dealokacji już wcześniej zwolnionej pamięci Freeing Invalid Memory FIM próba dealokacji pamięci, której użytkownik nie może zwalniać, np pamięć zarezerwowana na kodu programu Free Memory Read FMR czytanie z pamięci, która została zwolniona Free Memory Write FMW pisanie do pamięci, która została zwolniona

czytanie z nieprawidłowej pamięci, np. z pamięć Invalid Pointer Read IPR nieistniejącej w pamięci adresowej, pamięci z pierwszych 64K pamięci adresowej pisanie do nieprawidłowej pamięci, np. do Invalid Pointer Write IPW pamięć nieistniejącej w pamięci adresowej, pamięci z pierwszych 64K pamięci adresowej Memory Allocation Failure MAF Niepowodzenie alokacji pamięci Memory Leak MLK "wycieki pamięci" Null Pointer Read NPR czytanie z pamięci o adresie 0 Null Pointer Write NPW pisanie do pamięci o adresie 0 Uninitialized Memory Read UMR czytanie z niezainicjowanej pamięci Uninitialized Memory Copy UMC kopiowanie niezainicjowanej pamięci Handle In Use HIU niezwolnienie zasobów związanych z uchwytem W poniższym kodzie zostały pokazane przykładowe przyczyny wyżej wymienionych błędów: (UWAGA!!! Prostota błędów w poniższym kodzie wynika z ich dydaktycznego przeznaczenia.) //made by Krzysztof Jurczuk //rationalbugsexample.cpp : Defines the entry point for the console application. #include "stdafx.h" #include <iostream> using namespace std; class CTest{ private: int* pointer; public: int* beyonstack(){ int i; return &i; } }; int getpointer(){ return *pointer; } int main(int argc, char* argv[]){ ///////////////////////////////////////////////////////////// CTest test; int* i = test.beyonstack(); cout << *i; //BSR *i = 4; //BSW ///////////////////////////////////////////////////////////// const int MAX = 10; int* table1 = new int[ MAX ]; int* table2 = new int[ MAX ]; for( int k = 0; k <= MAX; k++ ) table1[ k ] = table2[ k ]; //ABW, ABR

///////////////////////////////////////////////////////////// int* j = new int(); delete j; delete j; //FFM cout << *j; //FMR *j = 4; //FMW j = NULL; cout << *j; *j = 4; //NPR, EXU } return 0; UWAGA!!! Wykonywanie powyższego kodu może powodować nieprzewidziane skutki. Wynik uzyskany po wykonaniu wypowyższego kodu przy użyciu Rational Purify:

3. PODSTAWY OBSŁUGI Rational Putify może zostać zintegrowany z wieloma środowiskami. Wersja 6.0 automatycznie integruje się z MS Visual 6.0, natomiast wersja 7.0 z MS Visual.NET. Każda z nich posiada możliwość zintegrowania z Eclipsem poprzez dołączone pluginy. Co więcej aplikacje w wersji skompilowanej mogą zostać sprawdzone poprzez ich uruchomienie w Rational Purify, który nie jest zintegrowany z żadnym środowiskiem (tzw. z ang. standalone application). Taki proces uruchomienia jest identyczny jak przy omówionej poniżej obsłudze JAVY (patrz punkt 3b) a) MS Visual C/C++ Przed uruchomieniem aplikacji należy powiadomić zintegrowany Rational Purify o konieczności zbierania informacji o poprawności kodu poprzez wybranie opcji Engaged Purify, z menu Purify lub odpowiedniego toolbaru: Zapewnia do dołączenie podczas kompilacji odpowiednich danych pozwalających na zbieranie potrzebnych informacji podczas wykonania: Po wykonaniu aplikacji zostaje przedstawiony raport z ewentualnymi błędami:

Wszystkie informacje w raportach są umieszczane w postaci drzewa, w którym wraz z większym zagłębieniem znajdziemy coraz więcej szczegółowych informacji na temat wybranego błędu: Umożliwia to także oglądanie kodu, który jest powodem danego błędu oraz bezpośrednie przeniesienie się do kodu źródłowego poprzez dwukrotne kliknięcie.

Jeśli chcemy wyfiltrować pewne rodzaje błędów możemy użyć tzw. "filtrów szybkich" poprzez wybór, z menu podręcznego lub z menu głównego, opcji "Quick Filter": Umożliwia to pozostawienie najważniejszych błędów przy braku czasu na analizę wszystkich. Możemy także stworzyć własne filtry poprzez opcje "Create Filter". Istnieje także możliwość porównania raportów z kolejnych wykonań programu przy użyciu opcji: "Run Controls ->Compare Runs". Uzyskane wyniki mogą zostać zapisane dla późniejszej analizy, czy też tworzenia raportów błędów tworzonego oprogramowania. Można także poddawać analizie aplikacje skompilowane (patrz. punkt 3b). Prezentowana aplikacja może być także używana podczas debugowania, wystarczy wybrać opcję "Settings->Break on Error". Gdy testujemy oprogramowanie wielomodułowe (np. wiele plików *.dll), można wyeliminować wybrane moduły ("Settings->Executable Settings" zakładka "Power Check" i opcja All modules configures).

b) JAVA Sytuacja przy programowaniu w języku JAVA wydaje się być o wiele prostsza ze względu na to, iż w większości przypadków nie musimy martwić się o błędy związane z pamięcią, ponieważ jej zwalnianiem zajmuje się Garbage Collector. Jednak bardzo często nie tylko początkujący programiści potrafią nieświadomie zapominać o powiadomieniu, że pewnie zasoby pamięciowe mogą być zwolnione. Niepotrzebna pamięć zabiera nam zasoby systemowe ograniczając tym samym pulę dostępnej, wolnej pamięci. Dlatego też Rational Purify pozwalana prześledzić jakie porcje pamięci są alokowane przed konkretne elementy w aplikacji. Ułatwia to znalezienie miejsc, które rezerwują zbyt dużo pamięci oraz miejsc, które zbyt długo przetrzymują niewykorzystywaną, ale nadal zarezerwowaną pamięć. Pozwala to zoptymalizować działanie tworzonego produktu, czyniąc go tym samym mniej "pamięcio-żernym". Podstawowymi błędami popełnianymi przez programistów JAVA, które są powodem niezwalniania już niepotrzebnej pamięci są: dodawanie obiektów do tablicy i pozostawienie ich tam, gdy są już nam niepotrzebne przy dalszym używaniu innych elementów tablicy (analogicznie jeśli chodzi o struktury dynamiczne jak Vector, czy też List) przetrzymywanie referencji w długo trwających wątkach, podstawienie pod nie NULL nie pomoże, zostaną dopiero zwolnione w momencie zakończenia wątku Aplikacje napisane w języku JAVA można testować na wiele sposobów, chociażby poprzez zintegrowanie posiadanego środowiska z Rational Purify lub też niezależnie od platformy programistycznej używając samego IBM Rational Purify (tzw. z ang. standalone application). Taki też sposób został przestawiony poniżej. W oknie powitalnym wybieramy opcję "Run". Następnie wybieramy do analizy plik *.jar z naszą aplikacją lub też plik *.class, który zawiera klasę z funkcją uruchomieniową (mimo iż na poniższym rysunku nazwa programu znajduje się w drugim polu należy ją podać w pierwszym, dalej już Rational Purify ustawi sam parametry wywołania tak jak jest to widoczne poniżej):

Po uruchomieniu aplikacji pojawi się nam analizator wykonania, na którym jest przedstawiony stan pamięci. Czerwone kropki oznaczają miejsca, w których działał Gargabe Collector. Na osi poziomej jest umieszczony czas, natomiast na osi pionowej stan pamięci. Standardowy proces analizy wygląda następująco: po uruchomieniu aplikacji czekamy, aż użycie pamięci ustabilizuje się wykonujemy zrzut stanu pamięci przy użyciu opcji "Snapshot memory profiling data" z toolbaru następnie wykonujemy aplikację z użyciem opcji, którą podejrzewany o nieprawidłowe zarządzanie wykorzystywaną pamięcią, następnie wracamy do stanu wyjściowego i znów wykonujemy zrzut stanu pamięci jeśli różnica zajętości pamięci jest znaczna (mimo wywołania działania Garbage Collector'a, poprzez opcję "Gargabe collect" z toolbaru ) może to świadczyć o nieprawidłowej obsłudze pamięci i stanowi to podstawę do analizy kodu odpowiedzialnego za sprawdzaną funkcjonalność

Można także porównać zrobione zrzuty stanu pamięci. Wystarczy zaznaczyć jeden z nich i użyć opcji "Compare runs" z toolbaru. Jeśli istnieje możliwość wybieramy jeden z poprzednich zrzutów. Jako wynik zobaczymy graf porównania wykonań: Zielone ścieżki oznaczają polepszenie stanu pamięci, natomiast czerwone większą zajętość pamięci. Więcej informacji można także uzyskać poprzez umieszczenie myszki nad elementami w grafie wywołań. W zakładce "Function List View" znajdziemy porównania wykonań konkretnych funkcji: Istnieje też możliwość uzyskania większej ilości informacji na temat danej funkcji poprzez dwukrotne kliknięcie na jej nazwie. Podobnie jak przy testowaniu aplikacji w niezarządzanym C/C++ możemy tworzyć filtry poprzez opcję "Filter Manager" z menu podręcznego. Uzyskane dane można zapisać np. w celu tworzenia raportów.

c) MS Visual.NET (managed code) Faza testowania aplikacji napisanej w kodzie zarządzanym platformy.net wyglądanie identycznie jak przy kodzie w języku JAVA (patrz punkt 3b). Natomiast proces uruchomienia identycznie jak przy kodzie niezarządzanym C/C++ (patrz punkt 3a). 4. WEWNĘTRZNA ZASADA DZIAŁANIA RATIONAL PURIFY Purify monitoruje wszystkie operacje związane z pamięcią w testowanej aplikacji i sprawdza czy są poprawne. Zapamiętuje informacje na temat pamięci: niezaalkowanej zaalokowanej niezainicjalizowanej zaalkowanej zainicjalizowanej zwolnionej. Służy do tego tablica, w której śledzony jest każdy bajt pamięci. Na każdy bajt w tablicy są przeznaczone 2 bity. Pierwszy mówi, czy pamięć jest zaalkowana, natomiast drugi czy jest zainicjalizowana. Pozwala to na zapamiętanie maksymalnie 4 stanów: czerwonego, żółtego, zielonego oraz niebieskiego: Red Memory Blue Memory illegal to write, read and free malloc free free Yellow Memory allocated but uninitilized write Green Memory allocated and uninitilized legal to write or free but illegal to read legal to write and read and free but only for free IBM Rational Purify przy każdej operacji związanej z pamięcią, sprawdza czy dana operacja jest dozwolona. Jeżeli zauważa nieprawidłową operacje dodaje błąd do raportu. Pamięć żółta - pamięć otrzymywana po wykonaniu malloc lub new ; jest to pamięć zaalokowana, ale niezainicjowana, zatem nie możemy na niej wykonywać operacji czytania Pamięć zielona - pamięć zaalkowana oraz zainicjalizowana

Pamięć czerwona pamięć zwolniona, z której nie możemy korzystać do momentu następnej alokacji Pamięć niebieska pamięć zwolniona, która wcześniej była zaalkowana oraz zainicjalizowana, ale już w tym momencie nie można z niej korzystać, do momentu kolejnej alokacji. IBM Rational Purify oprócz błędów związanych z pamięcią dynamiczną, potrafi wykrywać niepoprawne instrukcje na zmiennych globalnych oraz statycznych. Wykonuje to poprzez umieszczenie stref czerwonych (czyli pamięci o kolorze czerwonym) wokół pamięci przydzielonej dla danych zmiennych. Nie zapewnia to zawsze wykrycia błędów, ale na pewno pozwala na wykrycie korzystania z pamięci niezainicjalizowanej lub niezaalkowanej.