• Nie Znaleziono Wyników

Programowanie proceduralne

N/A
N/A
Protected

Academic year: 2021

Share "Programowanie proceduralne"

Copied!
61
0
0

Pełen tekst

(1)

Programowanie proceduralne

INP001210WL

rok akademicki 2018/19 semestr letni

Wykład 7

Karol Tarnowski

karol.tarnowski@pwr.edu.pl A-1 p. 411B

(2)

• Wykorzystanie debuggera

• Konfiguracja debuggera

• Wstrzymywanie działania programu

• Sprawdzanie wartości zmiennych

• Śledzenie działania programu

• Przykłady

Plan prezentacji

(3)

• Przykładowy projekt – program oblicza odsetki od podanej kwoty przy zadanym oprocentowaniu rocznym przez ustaloną liczbę lat

Wykorzystanie debuggera

(4)

Wykorzystanie debuggera

(5)

Wykorzystanie debuggera

(6)

• Symbole debuggowania

Project >> Build options >> Produce debugging symbols [-g] (zaznaczone)

Wykorzystanie debuggera

Konfiguracja

(7)

• Symbole debuggowania

Project >> Build options >> Produce debugging symbols [-g] (zaznaczone)

Wykorzystanie debuggera

Konfiguracja

(8)

Wykorzystanie debuggera

Konfiguracja

(9)

Wykorzystanie debuggera

Konfiguracja

(10)

• Symbole debuggowania

Project >> Build options >> Produce debugging symbols [-g] (zaznaczone)

• Opcja Strip all symbols from binary [-s] nie powinna być zaznaczona

Wykorzystanie debuggera

Konfiguracja

(11)

• Symbole debuggowania

Project >> Build options >> Produce debugging symbols [-g] (zaznaczone)

• Opcja Strip all symbols from binary [-s] nie powinna być zaznaczona

Wykorzystanie debuggera

Konfiguracja

(12)

• Symbole debuggowania

Project >> Build options >> Produce debugging symbols [-g] (zaznaczone)

• Opcja Strip all symbols from binary [-s] nie powinna być zaznaczona

• Cel kompilacji

Build >> Select target >> Debug

Wykorzystanie debuggera

Konfiguracja

(13)

• Symbole debuggowania

Project >> Build options >> Produce debugging symbols [-g] (zaznaczone)

• Opcja Strip all symbols from binary [-s] nie powinna być zaznaczona

• Cel kompilacji

Build >> Select target >> Debug

Wykorzystanie debuggera

Konfiguracja

(14)

• Definiowanie punktu wstrzymania Debug >> Toggle breakpoint

lub F5

Wykorzystanie debuggera

Wstrzymywanie działania

(15)

• Definiowanie punktu wstrzymania Debug >> Toggle breakpoint

lub F5

Wykorzystanie debuggera

Wstrzymywanie działania

(16)

• Definiowanie punktu wstrzymania Debug >> Toggle breakpoint

lub F5

Wykorzystanie debuggera

Wstrzymywanie działania

(17)

• Definiowanie punktu wstrzymania Debug >> Toggle breakpoint

lub F5

• Uruchomienie programu Debug >> Start

lub F8

Wykorzystanie debuggera

Wstrzymywanie działania

(18)

• Definiowanie punktu wstrzymania Debug >> Toggle breakpoint

lub F5

• Uruchomienie programu Debug >> Start

lub F8

Wykorzystanie debuggera

Wstrzymywanie działania

(19)

• Definiowanie punktu wstrzymania Debug >> Toggle breakpoint

lub F5

• Uruchomienie programu Debug >> Start

lub F8

Wykorzystanie debuggera

Wstrzymywanie działania

(20)

• Okna debuggera zawierają różne informacje o wykonywanym programie

Debug >> Debugging windows

Wykorzystanie debuggera

Okna debuggera

(21)

• Okna debuggera zawierają różne informacje o wykonywanym programie

Debug >> Debugging windows

Wykorzystanie debuggera

Okna debuggera

(22)

• Okna debuggera zawierają różne informacje o wykonywanym programie

Debug >> Debugging windows

• Okno Watches pokazuje wartości zmiennych lokalnych i argumentów funkcji

Wykorzystanie debuggera

Okna debuggera

(23)

• Okna debuggera zawierają różne informacje o wykonywanym programie

Debug >> Debugging windows

• Okno Watches pokazuje wartości zmiennych lokalnych i argumentów funkcji

Wykorzystanie debuggera

Okna debuggera

(24)

• W celu wykonania następnych wierszy programu wykonamy polecenie Next line (F7)

Wykorzystanie debuggera

Śledzenie działania programu

(25)

• W celu wykonania następnych wierszy programu wykonamy polecenie Next line (F7)

Wykorzystanie debuggera

Śledzenie działania programu

(26)

• W celu wykonania następnych wierszy programu wykonamy polecenie Next line (F7)

• Po osiągnięciu linii 12 program oczekuje na podanie danych (funkcja scanf())

• Podobnie w liniach 14 i 16

• Wartości zmiennych możemy sprawdzić w oknie Watches

Wykorzystanie debuggera

Śledzenie działania programu

(27)

• W celu wykonania następnych wierszy programu wykonamy polecenie Next line (F7)

• Po osiągnięciu linii 12 program oczekuje na podanie danych (funkcja scanf())

• Podobnie w liniach 14 i 16

• Wartości zmiennych możemy sprawdzić w oknie Watches

Wykorzystanie debuggera

Śledzenie działania programu

(28)

• Po osiągnięciu linii 17 wywołamy polecenie Step into, które służy do wejścia do funkcji, która ma zostać wywołana z bieżącego wiersza

Wykorzystanie debuggera

Śledzenie działania programu

(29)

• Po osiągnięciu linii 17 wywołamy polecenie Step into, które służy do wejścia do funkcji, która ma zostać wywołana z bieżącego wiersza

Wykorzystanie debuggera

Śledzenie działania programu

(30)

• Po osiągnięciu linii 17 wywołamy polecenie Step into, które służy do wejścia do funkcji, która ma zostać wywołana z bieżącego wiersza

Wykorzystanie debuggera

Śledzenie działania programu

(31)

• Po osiągnięciu linii 17 wywołamy polecenie Step into, które służy do wejścia do funkcji, która ma zostać wywołana z bieżącego wiersza

• Sterowanie w programie przejdzie do linii 25 (pierwsza instrukcja w wywołanej funkcji)

• Zmienne i oraz koncowy_mnoznik są niezainicjalizowane

Wykorzystanie debuggera

Śledzenie działania programu

(32)

• Po osiągnięciu linii 17 wywołamy polecenie Step into, które służy do wejścia do funkcji, która ma zostać wywołana z bieżącego wiersza

• Sterowanie w programie przejdzie do linii 25 (pierwsza instrukcja w wywołanej funkcji)

• Zmienne i oraz koncowy_mnoznik są niezainicjalizowane

Wykorzystanie debuggera

Śledzenie działania programu

(33)

• Po przejściu do kolejnego wiersza (F7) widzimy, że zmienna i została zainicjalizowana,

natomiast wartość zmiennej koncowy_mnoznik pozostała bez zmian

Wykorzystanie debuggera

Śledzenie działania programu

(34)

Wykorzystanie debuggera

Śledzenie działania programu

(35)

• Po przejściu do kolejnego wiersza (F7) widzimy, że zmienna i została zainicjalizowana,

natomiast wartość zmiennej koncowy_mnoznik pozostała bez zmian

• Znaleźliśmy błąd – niezainicjalizowaną zmienną – wykorzystując debugger

Wykorzystanie debuggera

Śledzenie działania programu

(36)

Wykorzystanie debuggera

Debugowanie awarii

(37)

Wykorzystanie debuggera

Debugowanie awarii

(38)

Wykorzystanie debuggera

Debugowanie awarii

• Ten program nie działa – kończy działanie w nieprawidłowy sposób

• Błędu można poszukiwać wykorzystując debugger

• Debugger zgłosi błąd segmentacji

(39)

• Debugger zatrzymał się w miejscu, w którym nastąpiła błędna instrukcja (linia 26)

Wykorzystanie debuggera

Debugowanie awarii

(40)

Wykorzystanie debuggera

Debugowanie awarii

(41)

• Debugger zatrzymał się w miejscu, w którym nastąpiła błędna instrukcja (linia 26)

• Wskaźnik n ma wartość 0xbaadf00d (bad food) – jest to specjalna wartość używana podczas

uruchamiania programów pod kontrolą debuggera do inicjalizowania pamięci

Wykorzystanie debuggera

Debugowanie awarii

(42)

• Prześledźmy stos wywołań (Call stack)

Wykorzystanie debuggera

Debugowanie awarii

(43)

• Prześledźmy stos wywołań (Call stack)

Wykorzystanie debuggera

Debugowanie awarii

(44)

• Prześledźmy stos wywołań (Call stack)

• Na dole widoczne jest wywołanie funkcji main(), które rozpoczęło program

• Następnie wywołano funkcję printList() trzy razy, przy czym w ostatnim wywołaniu pojawiła się

wartość 0xbaadf00d

• Znaleźliśmy błąd – niezainicjalizowany wskaźnik

Wykorzystanie debuggera

Debugowanie awarii

(45)

Wykorzystanie debuggera

Debugowanie awarii

(46)

• Informacje z innych ramek stosu możemy

uzyskać przełączając widok (Swich to this frame)

Wykorzystanie debuggera

Debugowanie awarii

(47)

• Informacje z innych ramek stosu możemy

uzyskać przełączając widok (Swich to this frame)

Wykorzystanie debuggera

Debugowanie awarii

(48)

Wykorzystanie debuggera

Zaglądanie do zawieszonego programu

• Jeśli program zatrzymał się z nieznanego powodu można wykorzystać debugger, aby włamać się do programu

(49)

Wykorzystanie debuggera

Zaglądanie do zawieszonego programu

(50)

Wykorzystanie debuggera

Zaglądanie do zawieszonego programu

• Po uruchamieniu programu w trybie debugowania mamy możliwość włamania się do niego

• Menu Debug >> Break debugger

(51)

Wykorzystanie debuggera

Zaglądanie do zawieszonego programu

• Po uruchamieniu programu w trybie debugowania mamy możliwość włamania się do niego

• Menu Debug >> Break debugger

(52)

Wykorzystanie debuggera

Zaglądanie do zawieszonego programu

• Po uruchamieniu programu w trybie debugowania mamy możliwość włamania się do niego

• Menu Debug >> Break debugger

• Po zatrzymaniu programu sprawdzamy stos wywołań

(53)

Wykorzystanie debuggera

Zaglądanie do zawieszonego programu

• Po uruchamieniu programu w trybie debugowania mamy możliwość włamania się do niego

• Menu Debug >> Break debugger

• Po zatrzymaniu programu sprawdzamy stos wywołań

(54)

Wykorzystanie debuggera

Zaglądanie do zawieszonego programu

• Po uruchamieniu programu w trybie debugowania mamy możliwość włamania się do niego

• Menu Debug >> Break debugger

• Po zatrzymaniu programu sprawdzamy stos wywołań

• Aby przejść do naszego programu musimy zmienić wątek

(55)

Wykorzystanie debuggera

Zaglądanie do zawieszonego programu

• Po uruchamieniu programu w trybie debugowania mamy możliwość włamania się do niego

• Menu Debug >> Break debugger

• Po zatrzymaniu programu sprawdzamy stos wywołań

• Aby przejść do naszego programu musimy zmienić wątek

(56)

Wykorzystanie debuggera

Zaglądanie do zawieszonego programu

• Po uruchamieniu programu w trybie debugowania mamy możliwość włamania się do niego

• Menu Debug >> Break debugger

• Po zatrzymaniu programu sprawdzamy stos wywołań

• Aby przejść do naszego programu musimy zmienić wątek

(57)

Wykorzystanie debuggera

Zaglądanie do zawieszonego programu

• Przechodząc przez kolejne wiersze,

obserwujemy, że program krąży między liniami 20 oraz 21

• Zmienna i przyjmuje tylko dwie wartości 2 oraz 3

(58)

• Przechodząc przez kolejne wiersze,

obserwujemy, że program krąży między liniami 20 oraz 21

• Zmienna i przyjmuje tylko dwie wartości 2 oraz 3

Wykorzystanie debuggera

Zaglądanie do zawieszonego programu

(59)

Wykorzystanie debuggera

Zaglądanie do zawieszonego programu

• Przechodząc przez kolejne wiersze,

obserwujemy, że program krąży między liniami 20 oraz 21

• Zmienna i przyjmuje tylko dwie wartości 2 oraz 3

• Możemy zauważyć, że pętla w działaniu programu wynikała z użycia operatora

przypisania w miejsce operatora porównania

(60)

Wykorzystanie debuggera

Zaglądanie do zawieszonego programu

(61)

• Wykorzystanie debuggera

• Konfiguracja debuggera

• Wstrzymywanie działania programu

• Sprawdzanie wartości zmiennych

• Śledzenie działania programu

• Przykłady

Podsumowanie

Cytaty

Powiązane dokumenty

[r]

• Podstawowym sposobem przekazywania zmiennych do funkcji jest przekazywanie przez wartość – funkcja nie zmieni.

Jeśli element wskazywany przez indeks jest większy od maksimum, to przypisz maksimum wartość elementu wskazywanego przez indeks 5.. • Przypisz maksimum_indeks

• Dostęp do struktur wskazywanych przez wskaźnik uzyskuje się operatorem ->.

rok akademicki 2017/18 semestr letni.

• Podstawowym sposobem przekazywania zmiennych do funkcji jest przekazywanie przez wartość – funkcja nie zmieni.

Jeśli element wskazywany przez indeks jest większy od maksimum, to przypisz maksimum wartość elementu wskazywanego przez indeks 5... • Przypisz maksimum_indeks

Spełnione jest założenie o normalności >> do weryfikacji hipotezy o średnich wybieramy test t. origin=1, origin=3) Sprawdzenie normalności. mpg dla origin=1 mpg dla origin=3