Laboratorium Informatyka (I) AiR Ćwiczenia z debugowania

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

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

Tworzenie oprogramowania

Wprowadzenie do środowiska Qt Creator

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

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

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

CODE::BLOCKS & VALGRIND OPRACOWAŁ MICHAŁ BETHKE

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

Programowanie w języku C++ Grażyna Koba

Programowanie Systemów Wbudowanych

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Podstawy Informatyki Wprowadzenie do języka C dr inż. Jarosław Bułat

Testowanie oprogramowania. Testowanie oprogramowania 1/34

Laboratorium 3: Preprocesor i funkcje ze zmienną liczbą argumentów. mgr inż. Arkadiusz Chrobot

Programowanie Systemów Czasu Rzeczywistego

PROGRAMOWANIE w C prolog

Programowanie obiektowe

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

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

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

Podział programu na moduły

Algorytm. a programowanie -

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

Krótka Historia. Co to jest NetBeans? Historia. NetBeans Platform NetBeans IDE NetBeans Mobility Pack Zintegrowane moduły. Paczki do NetBeans.

Makropolecenia w PowerPoint Spis treści

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

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

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

Komputer nie myśli. On tylko wykonuje nasze polecenia. Nauczmy się więc wydawać mu rozkazy

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

Aplikacje WWW - laboratorium

Przedrostkowa i przyrostkowa inkrementacja i dekrementacja

Robert Barański, AGH, KMIW MathScript and Formula Nodes v1.0

1 Podstawy c++ w pigułce.

Formatowanie tekstu przy uz yciu stylo w

Systemy Operacyjne. Ćwiczenia

Każdy popełnia błędy - Podstawy PHP

MentorGraphics ModelSim

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Przedmiot: Informatyka w inżynierii produkcji Forma: Laboratorium Temat: Zadanie 5. MessageBox, InputBox, instrukcja Select Case i instrukcje pętli.

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

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

Zapisywanie algorytmów w języku programowania

Instrukcja laboratoryjna cz.0

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

REFERAT PRACY DYPLOMOWEJ

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Nazwa wariantu modułu (opcjonalnie): Laboratorium programowania w języku C++

AKADEMIA GÓRNICZO-HUTNICZA IM. STANISŁAWA STASZICA W KRAKOWIE. QuIDE Quantum IDE PODRĘCZNIK UŻYTKOWNIKA

Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p.

Praktyka Programowania

Wprowadzenie do biblioteki klas C++

Być może jesteś doświadczonym programistą, biegle programujesz w Javie,

Informatyka I. dr inż. Andrzej Czerepicki.

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

Obsługa modułu. e-deklaracje. w programach WF-FaKir oraz WF-Gang. (opracował Przemysław Gola)

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?

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

ICD Wprowadzenie. Wprowadzenie. Czym jest In-Circuit Debugger? 2. O poradniku 3. Gdzie szukać dodatkowych informacji? 4

Zad. 5: Układ równań liniowych liczb zespolonych

Instrukcja laboratoryjna cz.3

Programowanie w Javie

LEKCJA 2. Szukaj dziury w całym: debugowanie

Od programowania wizualnego do tekstowego

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

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 3. Karol Tarnowski A-1 p.

Zadanie 2: Arytmetyka symboli

Programowanie C++ Wykład 1 - Aplikacje konsowlowe w środowisku QT. dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Zbigniew Sołtys - Komputerowa Analiza Obrazu Mikroskopowego 2015 część 13

Rok akademicki: 2013/2014 Kod: JFT s Punkty ECTS: 5. Poziom studiów: Studia I stopnia Forma i tryb studiów: Stacjonarne

Programowanie w Javie cz. 1 Wstęp. Łódź, 24 luty 2014 r.

Wyjątki (exceptions)

1 Podstawy c++ w pigułce.

Liczby losowe i pętla while w języku Python

Testy automatyczne. Korzystające z junit

Laboratorium nr 4: Arytmetyka liczb zespolonych

PRZEWODNIK PO PRZEDMIOCIE

Pierwsze kroki. Algorytmy, niektóre zasady programowania, kompilacja, pierwszy program i jego struktura

Archiwizacja baz MSSQL /BKP_SQL/ opis oprogramowania

Języki programowania

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

Systemy mobilne. Laboratorium. Dostęp do danych GPS w Windows Phone 7

Instalacja oprogramowania KISSsoft 03/2017

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

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

Konfiguracja pakietu CrossStudio for MSP

PRZEWODNIK PO PRZEDMIOCIE

Scenariusz lekcji opartej na programie Program nauczania informatyki w gimnazjum DKW /99

Programowanie i techniki algorytmiczne

Podstawy i języki programowania

Wstęp do programowania. Wykład 1

INŻYNIERIA OPROGRAMOWANIA TESTOWANIE INTEGRACYJNE

PROLOG WSTĘP DO INFORMATYKI. Akademia Górniczo-Hutnicza. Wydział Elektrotechniki, Automatyki, Informatyki i Inżynierii Biomedycznej.

Instrukcja korzystania z Virtual Box-a i SQLPLUS-a

Electronic Infosystems

Zakres tematyczny dotyczący podstaw programowania Microsoft Office Excel za pomocą VBA

1. Tworzenie nowego projektu.

Podstawy Programowania 2

Krótki kurs obsługi środowiska programistycznego Turbo Pascal z 12 Opracował Jan T. Biernat. Wstęp

Transkrypt:

Laboratorium Informatyka (I) AiR Ćwiczenia z debugowania Krzysztof Kluza, Janusz Miller 1 Debugowanie Debugowanie, czy też po polsku odpluskiwanie, to proces polegający na kontrolowanym wykonaniu programu przy użyciu odpowiedniego narzędzia (tzw. debuggera) w celu redukcji błędów występujących w programie. Jeśli zamierzasz debugować swój program, oznacza to, że nie działa on poprawnie. Najlepiej byłoby zatem pisać program tak, aby dobrze działał. Aby nie dopuścić do powstania sytuacji, w których konieczne byłoby debugowanie, warto pisać program: po dokładnym przemyśleniu jego budowy i sposobu działania, w taki sposób, aby jego kod był zrozumiały i czytelny, gdyż wtedy o wiele prościej będzie znaleźć w nim błędy. Często na zajęciach (np. podczas oddawania programów) można odnieść wrażenie, że ignorowane jest działanie programu, natomiast dużą wagę przykłada się do kodu. Wiąże się to z odpowiedzią na pytanie, co jest ważniejsze: czytelność programu czy to, że poprawnie działa? Jeśli program jest czytelny, można łatwo naprawić błędy, tak aby dobrze działał. W przypadku nieczytelnego programu trudno w ogóle mówić o pewności, że działa poprawnie. 1.1 Kompilacja Dla początkujących programistów sukcesem jest sam fakt, że program się kompiluje i działa. Jednakże dobrze napisany kod powinien być estetyczny i zrozumiały, ale przede wszystkim wolny od błędów. Zatem kompilacja to dopiero początek drogi... Jednak zacząć należy od kompilacji zawsze warto używać opcji: -Wall -ansi -pedantic zostaną wtedy wyświetlone dodatkowe ostrzeżenia. Ich 1

wystąpienie warto przemyśleć, gdyż w przyszłości mogą stać się albo problemem dla innych programistów pracujących z naszym kodem, albo wręcz spowodować błąd programu. Ćwiczenie Pobierz plik d1.c, nieprzeglądajgotylkozapisznadyskuispróbuj skompilować bez opcji, po czym uruchom program... Jak możesz zdiagnozować powstała w nim jakaś nieskończona pętla. Wciśnij Ctrl+C aby zakończyć wykonywany program. Skompiluj program przy pomocy podanych opcji. Otwórz program w drugim terminalu i poszukaj podejrzanych linii. Po każdorazowym znalezieniu błędu powtórz kompilację aż do uzyskania braku ostrzeżeń. 1.2 Asercje Znalezienie bugów w dużym programie często jest bardzo trudne, dlatego już na początku warto zatroszczyć się o mechanizmy ułatwiające proces odnajdywania błędów. Efektywnym sposobem unikania błędów oprogramowania jest jego testowanie. Najprostszym przykładem testowania jest pisanie odpowiednich konstrukcji warunkowych, które sprawiają, że program reaguje w odpowiedni sposób na sytuacje wyjątkowe. Innym sposobem (na etapie tworzenia oprogramowania) są specjalne makra (tzw. asercje). W przypadku występowania użycia w programie asercji, jeśli w czasie działania programu makro stwierdzi np. nieprawidłową wartość zmiennej wyrzuci błąd, a ponieważ sami makro pisaliśmy, możemy łatwiej stwierdzić skąd błąd się mógł wziąć. Skompiluj program z listingu 1, a następnie uruchom go i zaobserwuj działanie asercji. # include <assert.h> int main() { int i = 0; assert(i!=5); i++; assert(i==0); return 0; } Listing 1: Przykładowy program z asercjami 2

Takie przerwanie programu i wyrzucenie błędu nie stanowi oczywiście problemu w trakcie pracy nad programem w wersjach testowych. Co natomiast począć, jeśli nie chcemy by wyrzuciło nam przypadkiem błąd w trakcie działania programu w wersji RTM? Wystarczy przed dołączeniem pliku nagłówkowego assert.h zdefiniować makro NDEBUG: #define NDEBUG. Ćwiczenie W pliku d1.c zdefiniowana zostało makro NDEBUG. Zakomentuj je, anastępnieskompilujprogramiuruchomgo. Zdiagnozuj problem na podstawie zatrzymanego przez asercję programu. Obejrzyj kod programu, a następnie zastanów się, jakie błędy elementy tego kodu mogą powodować i spróbuj je poprawić. 1.3 GNU Debugger Gdy kod się kompiluje bez ostrzeżeń i błędów, uruchamia i działa nie powodując wycieków pamięci nie oznacza to, że wszystko jest w porządku. Istnieje bowiem możliwość, że nie działa prawidłowo. Debugger to narzędzie służące do dynamicznej analizy innych programów, które ułatwia odnalezienie i identyfikację zawartych w nich błędów. Debugger umożliwia zlokalizowanie instrukcji odpowiedzialnych za wadliwe działanie programu poprzez śledzenie wartości poszczególnych zmiennych, wykonywanie instrukcji krok po kroku, a także wstrzymywanie działania programu w zdefiniowanych miejscach. GNU Debugger (gdb) to narzędzie będące częścią projektu GNU. Działa on w trybie tekstowym, ale istnieją zintegrowane środowiska programistyczne potrafiące prezentować wyniki działania GNU Debuggera. 1.3.1 Ćwiczenie 1 Pobierz kod programu w pliku d2.c, anastępnieskompilujprogram iuruchomgo. Program generuje wyjątek w czasie działania. Aby odnaleźć, w którym miejscu się to dzieje użyjemy debuggera. Najpierw skompiluj program z opcją-g, która umożliwi potem jego debugowanie. 1 Na podstawie: http://www.tutorialspoint.com/gnu_debugger/gdb_debugging_ example1.htm 3

Czas na debugowanie: Załaduj program do debuggera: gdb./a.out. Uruchom go: run. Program powinien zatrzymać się z wyrzuconym wyjątkiem. Wpisanie komendy where pokaże, w którym miejscu został wyrzucony wyjątek. Komenda list pokaże najbliższe linie kodu w okolicy tego miejsca, gdzie został wyrzucony wyjątek. Z kolei komendaprint umożliwia podejrzenie wartości zmiennych, np. print x. Wymienione komendy działają poprawnie także po wpisaniu skróconej nazwy (dopóki jest ona jednoznaczna dla debuggera), np. w postaci jednoliterowej p x zamiast print x. 1.4 Analiza kodu Ściągnij ze strony pliki cw1.c oraz cw2.c. Przeanalizuj kod, stwórz plik wejściowy, a następnie uruchom program. Spróbuj przy pomocy debuggera znaleźć miejsce powstania błędu w programie i poprawić je. 4

2 Oprogramowanie do debugowania i testowania aplikacji Istnieje wiele narzędzi do debugowania i testowania aplikacji, niektóre z nich (dla języka C) wymienione zostały na poniższej liście: GNU DataDisplayDebuger 2 graficzne środowisko do debugowania przu użyciu gdb, czy dbx. Oprócz podświetlania składni, oferuje również graficzne wyświetlanie np. struktur danych w postaci grafów. Valgrind 3 pomaga w diagnozwaniu błędów w zarządzaniu pamięcią (głównie do wykrywania wycieków pamięci). CUnit 4 framework do testów jednostkowych dla języka C. Testwell CTC++ footnotehttp://www.verifysoft.com/pl_ctcpp.html narzędzie sprawdzające pokrycie kodu oprogramowania. Check 5 i CuTest 6 kolejne frameworki do testów jednostkowych. Cmockery 7 niewielka biblioteka do tworzenia testów jednostkowych. CMock 8 narzędzie to tworzenia modułów i obiektów imitujących zachowanie pewnych funkcji, użyteczne do interakcyjnych testów jednostkowych. 2 http://www.gnu.org/software/ddd/ 3 http://www.valgrind.org 4 http://cunit.sourceforge.net/index.html 5 http://check.sourceforge.net/ 6 http://cutest.sourceforge.net/ 7 http://code.google.com/p/cmockery/ 8 http://sourceforge.net/apps/trac/cmock/wiki 5