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

Podobne dokumenty
MS Visual Studio 2005 Team Suite - Performance Tool

Piotr Dwieczkowski. Code coverage. Mierzenie pokrycia kodu, teoria oraz praktyka w C/C++

Sposoby wykrywania i usuwania błędów. Tomasz Borzyszkowski

Optymalizacja programów Open Source. Profilery wysokiego poziomu część 2. Krzysztof Lichota

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

Laboratorium Informatyka (I) AiR Ćwiczenia z debugowania

Fragment wykładu z języka C ( )

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

NETBEANS PROFILER TOMASZ ŁUKASZUK

Delphi podstawy programowania. Środowisko Delphi

Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania

Ćwiczenie 1. Przygotowanie środowiska JAVA

Kurs języka Python. Wykład 11. Marcin Młotkowski. 4 stycznia Kontrola poprawności podczas biegu programu. 2 Testowanie oprogramowania

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

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

Automatyczna klasyfikacja zespołów QRS

1 Podstawy c++ w pigułce.

Wstęp do programowania. Wykład 1

NS-2. Krzysztof Rusek. 26 kwietnia 2010

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Narzędzia do oceny wydajności kodu. Narzędzia do oceny wydajności kodu 1/32

Wprowadzenie do biblioteki klas C++

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 26 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 28

Analizator wydajności AMD CodeAnalyst

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

Programowanie w języku Python. Grażyna Koba

Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania InTouch

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Pracownia internetowa w każdej szkole (edycja Jesień 2007)

Część I: Przypisanie makr do obiektu (przycisku).

Wydział Elektryczny. Katedra Automatyki i Elektroniki. Instrukcja do ćwiczeń laboratoryjnych z przedmiotu: PROGRAMOWALNE STRUKTURY LOGICZNE

Java jako język programowania

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 25 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 38

Wstęp do programowania

TABLICA (ang. array) pojedyncza zmienna z wieloma komórkami, w których można zapamiętać wiele wartości tego samego typu danych.

Programowanie obiektowe

MentorGraphics ModelSim

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

Trochę o plikach wsadowych (Windows)

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

Wstęp 7 Rozdział 1. OpenOffice.ux.pl Writer środowisko pracy 9

Projektowanie baz danych za pomocą narzędzi CASE

Programowanie proceduralne w języku C++ Podstawy

Wykaz zmian w programie WinAdmin Replikator

Informatyka I stopień (I stopień / II stopień) Ogólnoakademicki (ogólno akademicki / praktyczny)

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Materiały dodatkowe. Simulink Real-Time

Podział programu na moduły

Rys. 1. Główne okno programu QT Creator. Na rysunku 2 oznaczone zostały cztery przyciski, odpowiadają kolejno następującym funkcjom:

PRZEWODNIK PO PRZEDMIOCIE

Rozkłady zajęć- notatki

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

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

Uniwersytet Mikołaja Kopernika w Toruniu. Profilowanie ruchu sieciowego w systemie GNU/Linux

Przykładowe sprawozdanie. Jan Pustelnik

Kompilacja i scalanie programów w linii poleceń gcc i make

Załącznik nr 1. Specyfikacja techniczna portalu internetowego Łódź, r.

Programowanie obiektowe zastosowanie języka Java SE

Scenariusz lekcji. Scenariusz lekcji 1 TEMAT LEKCJI: 2 CELE LEKCJI: 2.1 Wiadomości: 2.2 Umiejętności: 3 METODY NAUCZANIA: 4 ŚRODKI DYDAKTYCZNE:

Tworzenie i wykorzystanie usług sieciowych

Programowanie obiektowe i C++ dla matematyków

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki

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

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

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

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Technologia znaku wodnego dla plików dźwiękowych: Legimi Audio Watermark

MATERIAŁY DO ZAJĘĆ I. Podstawowe pojęcia. Algorytm. Spis treści Przepis

KATEGORIA OBSZAR WIEDZY

Diagnostyka pamięci RAM

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

Python wstęp. Michał Bereta

TECHNOLOGIE INTERNETOWE WYKŁAD 6. JavaScript Funkcje i obiekty

Zakład Systemów Rozproszonych

Celem ćwiczenia jest zapoznanie się z podstawowymi funkcjami i pojęciami związanymi ze środowiskiem AutoCAD 2012 w polskiej wersji językowej.

Podstawy Programowania 2

Działanie i charakterystyka sterownika GE FANUC VersaMaxNano

Pomoc do programu ISO Manager

Język C i C++. Podstawy. Zagadnienia do opanowania. Przykład 1. (modyfikuj kod, aby zrealizować punkty 5., 7.)

1 Podstawy c++ w pigułce.

PL/SQL Hierarchical Profiler jako zaawansowana metoda strojenia wydajności aplikacji

Język JAVA podstawy. wykład 1, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

MCAD wersja od 5.0 instrukcja instalacji ręcznej w AutoCAD.

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Administracja i programowanie pod Microsoft SQL Server 2000

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

System magazynowy małego sklepu.

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

Układy VLSI Bramki 1.0

PRZEWODNIK PO PRZEDMIOCIE

Wstęp. Opis programu :

System kadrowo-płacowy KOMAX 2.0

WPROWADZENIE DO JĘZYKA JAVA

METODY REPREZENTACJI INFORMACJI

1 Zapoznanie się ze środowiskiem Xenomai.

Wykład 4. Środowisko programistyczne

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

Transkrypt:

GNU GProf i GCov przygotował: Krzysztof Jurczuk Politechnika Białostocka Wydział Informatyki Katedra Oprogramowania ul. Wiejska 45A 15-351 Białystok Streszczenie: Dokument zawiera podstawowe informacje na temat narzędzia GNU GProf i GCov. Po krótkim wprowadzeniu do tematyki profilowania aplikacji, została w nim przedstawiona zasada pracy z ww. narzędziami (kompilacja, uruchamianie i analiza wyników). 1. Wprowadzanie Profilowanie czasu wykonania aplikacji jest nieodłącznym elementem tworzenia zaawansowanych aplikacji. Głównym zadaniem narzędzi profilujących jest zbadanie testowanego oprogramowania pod kątem czasu poświęcanego na poszczególne linie kodu, funkcje czy też większe moduły. Pozwala to ukierunkować proces optymalizacji na fragmenty kodu, które zajmują najwięcej czasu wykonania. Dzięki temu tzw. wąskie gardła (ang., bottle neck) mogą zostać szybciej zidentyfikowane i zlikwidowane. Jednym z narzędzi do profilowania aplikacji pod systemem operacyjnym Linux jest GNU GProf. Umożliwia one zbieranie statystyk czasowych podczas wykonania aplikacji. Często wraz z nim używane jest narzędzie GNU GCov, które dostarcza szczegółowych statystyk na temat pokrycia kodu. Dzięki niemu możemy łatwiej przetestować aplikację (testy pokrycia kodu i kompletności danych wejściowych) oraz znaleźć tzw. martwy kod. 2. Użycie narzędzia GNU Gprof Aby skorzystać z prezentowanego narzędzia należy wykonać trzy następujące czynności: skompilować program tak, aby dodawał niezbędne informacje dla profilera uruchomić wcześniej odpowiednio skompilowany program uruchomić gprof z wynikami kompilacji a) kompilacja Podstawową opcją, którą trzeba podać dla kompilatora jest -pg. Trzeba ją dodać zarówno podczas kompilacji oraz linkowania (chyba, ze wykonujemy te dwie operacje na raz). Powoduje ona zbieranie informacji podczas wykonania aplikacji, które później możemy analizować. Dodatkowo jeśli chcemy przeprowadzić profilowanie na szczeblu pojedynczych linii należy dodać opcję debugera -g oraz -a. $ g++ -pg gprof_ex.cpp -o plikwykonywalny b) uruchomienie Po wykonaniu kompilacji z odpowiednimi flagami należy uruchomić aplikacje w sposób standardowy. $./plikwykonywalny Testowany program może działać trochę wolniej ze względu na konieczność zbierania informacji dla profilera. Należy pamiętać, aby odpowiednio dobierać dane wejściowe, ponieważ niewykonywane funkcje nie będą testowane. Wyniki są zapisywane do pliku gmon.out tuż przed zamknięciem wykonania aplikacji, o ile zakończy się ona prawidłowo, czyli przez wywołanie return, ewentualnie

exit. c) analiza wyników W celu przeprowadzenia analizy otrzymanych wyników z pliku gmon.out należy uruchomić profilera gprof z parametrem będącym nazwą pliku wykonywalnego oraz ewentualnie opcjami i plikiem z danymi do profilowania. Istnieje także możliwość użycia graficznych nakładek na gprof (np. KCacheGrind, KProf). $ gprof [opcje]./plikwykonywalny [plik_z_danymi_do_profilowania] Opcje: -A włącza tryb wydruku kodu z komentarzem -J wyłącza tryb wydruku kodu z komentarzem -p włącza profil płaski -P wyłącza profil płaski -q włącza graf wywołań -Q wyłącza graf wywołań -b wyłącza legendę -l włącza profilowanie za poziomie pojedynczych linii -z wyświetla także te funkcje, które nigdy się nie wykonały Domyślnym zestawem opcji jest -p -q. profil płaski Poniżej widać przykładowy wydruk analizy prostego programu przy pomocy profilu płaskiego: Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls s/call s/call name 90.08 37.59 37.59 24000 0.00 0.00 sorttable(int*) 10.64 42.03 4.44 24 0.19 1.75 test1() 0.00 42.03 0.00 24 0.00 0.00 displaytable(int*) 0.00 42.03 0.00 24 0.00 0.00 filltable(int*) %time czas spędzony w danej funkcji względem całego czasu wykonania aplikacji cumulative seconds ilość sekund spędzonych w danej funkcji plus w funkcjach leżących nad nią w tabeli self seconds czas spędzony w danej funkcji calls ilość wywołań danej funkcji self s/call średni czas spędzony w danej funkcji total s/call średni czas spędzony w danej funkcji oraz w funkcjach, które zostały z niej wywołane name nazwa danej funkcji graf wywołań Tryb ten przedstawia więcej informacji na temat czasu wykonania aplikacji. Pozwala na przykład

wykryć funkcje, które same w sobie wykonują się krótko, natomiast wywoływane z nich funkcje stanowią wąskie gardło. Poniżej widać przykładowy wydruk analizy prostego programu przy pomocy grafu wywołań: index % time self children called name <spontaneous> [1] 100.0 0.00 42.03 main [1] 4.44 37.59 24/24 test1() [2] 4.44 37.59 24/24 main [1] [2] 100.0 4.44 37.59 24 test1() [2] 37.59 0.00 24000/24000 sorttable(int*) [3] 0.00 0.00 24/24 filltable(int*) [11] 0.00 0.00 24/24 displaytable(int*) [10] 37.59 0.00 24000/24000 test1() [2] [3] 89.4 37.59 0.00 24000 sorttable(int*) [3] 0.00 0.00 24/24 test1() [2] [10] 0.0 0.00 0.00 24 displaytable(int*) [10] 0.00 0.00 24/24 test1() [2] [11] 0.0 0.00 0.00 24 filltable(int*) [11] Linie składające się z samych myślników dzielą tabele na wpisy odpowiadające pojedynczym funkcjom. Pojedynczy wpis dla funkcji może składać się więcej niż z jednej linii. Funkcja, której wpis dotyczy jest oznaczona indeksem w nawiasach kwadratowych. Funkcje znajdujące się powyżej są to funkcje ją wywołujące, tzw. "rodzice", natomiast funkcje poniżej są to funkcje przez nią wywoływane, tzw. funkcje "potomne". Wpisy są uporządkowane od najbardziej do najmniej czasochłonnej funkcji. index pozwala odnaleźć funkcję, której dotyczą podawane statystyki, jednocześnie jest to numer porządkowy nadawany kolejnym funkcjom w programie %time czas spędzony w danej funkcji (i funkcjach z niej wywoływanych) względem całego czasu wykonania aplikacji %self linijka główna całkowity czas spędzony w danej funkcji linijka "rodzica" czas spędzony w danej funkcji, gdy została ona wywołana z podanego "rodzica" linijka "potomka" czas spędzony w funkcji potomnej, gdy została wywołana z danej funkcji %children linijka główna - całkowity czas spędzony w funkcjach potomnych danej funkcji linijka "rodzica" czas spędzony w funkcjach potomnych, gdy dana funkcja została wywołana z danego rodzica linijka "potomka" czas spędzony w funkcjach potomnych danego potomka danej funkcji %called linijka główna ilość wywołań danej funkcji, w przypadku wywołań rekurencyjnych pojawiają się dwie liczby oddzielone znakiem '+', gdzie pierwsza liczba to ilość wywołań nierekursywnych, a druga rekursywnych linijka "rodzica" ilość wywołań danej funkcji z danego rodzica oraz ilość nierekursywnych wywołań danej funkcji ze wszystkich rodziców

linijka "potomka" ilość wywołań danego potomka z danej funkcji oraz ilość wszystkich nierekursywnych wykonań danego potomka %name nazwa funkcji oraz jej numer porządkowy Jeśli występują wywołania rekursywne, np. funkcja silnia() wywołuje funkcję silnia()itd., powstaje problem jak liczyć wartości children i self. W takim przypadku gprof numeruje kolejne cykle i dla każdego z nich umieszcza oddzielny wpis. Zawiera on informacje o czasie wywołania wszystkich funkcji w cyklu. "Rodzicami" są funkcję, które nie należą do cyklu i wywołały bezpośrednio jakieś funkcje cyklu. Natomiast funkcje potomne to wszystkie funkcje cyklu oraz funkcje bezpośrednio przez nie wywoływane. profilowanie pojedynczych linii Tryb ten pozwala stwierdzić ile razy wykonała się dana funkcja oraz dane linie kodu. Wyliczone zostają także średnie czasy wykonania dla funkcji oraz jednej linii kodu. Aby móc uzyskać wszystkie informacje należy skompilować kod dodatkowo z opcjami -g -a. 3. Użycie narzędzia GNU GCov Aby skorzystać z prezentowanego narzędzia należy wykonać trzy następujące czynności: skompilować program tak, aby dodawał niezbędne informacje dla profilera uruchomić wcześniej odpowiednio skompilowany program uruchomić gcov z wynikami kompilacji a) kompilacja Program profilowany narzędziem GNU GCov powinien zostać skompilowany z opcjami umożliwiającymi zbieranie informacji podczas jego działania: -fprofile-arcs -ftestcoverage (jeśli oddzielnie wykonujemy proces linkowania i kompilacji, trzeba je podać podczas tych dwóch operacji). Pierwsza opcja powoduje powstanie pliku *.gcda podczas kompilacji, który pomaga zrekonstruować graf działania aplikacji, druga natomiast powoduje powstanie plików *.gcno dla każdego pliku obiektowego podczas uruchomienia. Pliki z rozszerzeniem.gcno zawierają podsumowania wyników pokrycia kodu. $ g++ -fprofile-arcs -ftest-coverage gcov_ex.cpp -o plikwykonywalny b) uruchomienie Po wykonaniu kompilacji z odpowiednimi flagami należy uruchomić aplikacje w sposób standardowy: $./plikwykonywalny Testowany program może działać trochę wolniej ze względu na konieczność zbierania informacji na temat pokrycia kodu. c) analiza wyników Aby uzyskać czytelny opis kodu wraz z częstotliwością wykonywania się poszczególnych linii należy uruchomić gcov z nazwą pliku źródłowego jako parametrem: $ gcov gcov_ex.cpp File `gcov_ex.cpp' Lines executed:87.50% of 8 gcov_ex.cpp:creating `gcov_ex.cpp.gcov'

Spowoduje to powstanie pliku plikzródłowy.gcov, w którym zawarte są informacje na temat pokrycia kodu: -: 0:Source:gcov_ex.cpp -: 0:Graph:gcov_ex.gcno -: 0:Data:gcov_ex.gcda -: 0:Runs:1 -: 0:Programs:1 -: 1:#define SIZE 1000 -: 2: -: 3:int main() function main called 1 returned 100% blocks executed 83% 1: 4:{ 1: 5: int suma = 0, i = 0; -: 6: 2001: 7: for( ; i < SIZE; i++ ) 1000: 8: suma += i; -: 9: 1: 10: for( ; i < SIZE; i++ ) #####: 11: suma += i; -: 12: 1: 13: return 0; 1: 14:} Jeśli chcemy możemy także użyć programu lcov do generacji statystyk w postaci plików html. Przykład użycia: $ g++ -pg gcov_ex.cpp -o plikwykonywalny $./plikwykonywalny $ lcov --capture --directory. --output-file nazwa.info -test-name "test" $ genhtml nazwa.info -title "Przyklad" -show-details Przykładowe pliki html z wynikami: