„DEBUGGER W TURBO PASCALU”
WPROWADZENIE
System Turbo Pascal, począwszy od wersji 5.0, posiada wbudowany program umożliwiający umiejscawianie i usuwanie usterek w programach pascalowych. Program ten (ang. debugger) umożliwia też oddzielne wykonanie każdego wiersza programu pascalowego ze śledzeniem wartości dowolnych zmiennych i wyrażeń oraz modyfikację wartości zmiennych.
Z umiejscawianiem i usuwaniem usterek związane są trzy opcje głównego menu systemu Turbo Pascal: Run, Debug i Break/Watch. Zawarte w tych opcjach polecenia dla debuggera mogą być zainicjowane w zwykły sposób, tzn. przez przesunięcie podświetlenia na dane polecenie (za pomocą klawiszy ↑ lub ↓) i naciśnięcie klawisza Enter lub przez naciśnięcie klawisza z pierwszą literą danego polecenia. Oczywiście w obu przypadkach menu danej opcji musi być aktywne. Większość poleceń dla debuggera dostępna jest także z dowolnego miejsca systemu Turbo Pascal przez naciśnięcie odpowiednich klawiszy.
RODZAJE BŁĘDÓW
W realizacji algorytmów w dowolnym języku programowania mogą wystąpić błędy trzech rodzajów:
- błędy syntaktyczne, związane ze składnią danego języka programowania, które wykrywane są przez kompilator;
- błędy semantyczne, występujące podczas wykonywania programu i związane z próbą wykonania niedozwolonej operacji (np. dzielenie przez zero lub otwieranie nie istniejącego zbioru);
- błędy logiczne, powstałe wskutek błędnego zaprogramowania algorytmu. System Turbo Pascal zapewnia bardzo dobrą sygnalizację błędów syntaktycznych i semantycznych. Błędy logiczne w programie napisanym w języku Turbo Pascal są, podobnie jak w programach napisanych w innych językach, bardzo trudne do wykrycia i zlokalizowania. Właśnie przy tego typu błędach niezmiernie użyteczny jest debugger, za pomocą którego można prześledzić wykonywanie poszczególnych fragmentów programu (w tym wartości przypisywane zmiennym i wyrażeniom) i w efekcie zlokalizować błąd lub błędy logiczne.
Polecenia dla debuggera
Polecenie menu Klawisz(e) Funkcja
|
Run/Run Ctrl-F9 wykonanie programu
Run/Program reset Ctrl-F2 zakończenie sesji debuggera (zwolnienie przydzielonej pamięci, zamknięcie plików, przygotowanie do rozpoczęcia nowej sesji)
Run/Go to cursor F4 zainicjowanie sesji debuggera i wykonanie programu z zatrzymaniem w wierszu zawierającym kursor
Run/Trace into F7 zainicjowanie sesji debuggera i wykonanie bieżącej instrukcji programu (jeśli instrukcją tą jest wywołanie procedury, to za bieżący wiersz wykonawczy zostanie przyjęty wiersz rozpoczynający treść procedury)
Run/Step over F8 zainicjowanie sesji debuggera i wykonanie bieżącej instrukcji programu (jeśli instrukcją tą jest wywołanie procedury to zostanie ona w całości wykonana)
Run/User screen ALt-F5 przełączenie ekranu systemowego na ekran wyjściowy (wykonawczy)
Options/Compiler - umiejscawianie błędów wykonania w
/Debug information programie źródłowym
Options/Compiler - generowanie informacji o lokalnych /Local symbols stałych i zmiennych
Options/Environment F5 powiększenie lub zmniejszenie
/Zoom windows aktywnego okna systemu
Debug/Evaluate Ctrl-F4 obliczanie wartości zmiennych i wyrażeń oraz modyfikowanie wartości zmiennych
Debug/Call stack Ctrl-F3 wyświetlenie listy wywołań funkcji i procedur prowadzących do aktualnego położenia kursora
Debug/Find procedure - odszukanie funkcji lub procedury w programie
Debug/Integrated - określenie stosowania debuggera
debugging wewnętrznego
Debug/Stand-alone - określenie stosowania debuggera debugging zewnętrznego
DebuglDisplay - określenie sposobu zmiany ekranu
swapping podczas sesji debuggera
Debug/Refresh display - odzyskanie ekranu systemowego
BreaklWatch Ctrl-F7 dodanie zmiennej lub wyrażenia do /Add watch Watch
Break/Watch/Delete - usunięcie z okienka bieżącej watch zmiennej lub wyrażenia
Break/Watch/Edit - modyfikowanie bieżącego wyrażenia watch okienka Watch
Break/Watch/Remove - skasowanie zawartości okienka
all watches Watch
Break/Watch/Toggle Ctrl-F8 ustalenie punktu kontrolnego w breakpoint programie
Break/Watch/Clear all - usunięcie wszystkich punktów breakpoints kontrolnych programu
Break/Watch/View next - przesunięcie położenia kursora do breakpoint następnego punktu kontrolnego programu
- F6 przełączenie aktywnego okna systemu
- Alt-F6 przy aktywności okienka edytowania - wprowadzenie do edytora poprzednio redagowanego zbioru źródłowego, a przy aktywności okienka Watch lub okienka wyjściowego - przełączanie pomiędzy tymi okienkami
ROZPOCZĘCIE SESJI UMIEJSCAWIANIA I USUWANIA USTEREK PROGRAMOWYCH
Przed rozpoczęciem sesji debuggera należy polecić kompilatorowi języka Turbo Pascal generowanie dla danego programu wewnętrznej tablicy symboli. Tablica ta jest bazą danych o wszystkich stosowanych w programie identyfikatorach (stałych, typach, zmiennych, procedurach i funkcjach) z numerami wierszy, w których one występują. Oprócz tego wygodnie jest polecić kompilatorowi utworzenie tablic symboli lokalnych, które zawierać będą analogiczne informacje o identyfikatorach lokalnych w treści każdej procedury i funkcji. Oba polecenia mogą być ustanowione w menu systemu (Options/Compiler/Debug information i Options/Compiler/Local symbols) lub bezpośrednio w programie za pomocą dyrektyw kompilatora {$D+} i {$L+). Warto zaznaczyć, że w interakcyjnym systemie Turbo Pascal polecenia te ustanowione są standardowo.
Jeśli sesja umiejscawiania i usuwania usterek ma być obsłużona przez debugger wbudowany w system Turbo Pascal, to należy upewnić się, czy parametr Integrated debugging opcji Debug jest włączony, tj. ustalony na On (przyjmowane jest to standardowo przez system). W przypadku, gdy sesja będzie przeprowadzona przez debugger zewnętrzny (może nim być Turbo Debugger l.5 firmy Borland International), należy włączyć, tj. ustalić na On, parametr Standalone debugging, występujący w tej samej opcji (standardowo parametr ten jest wyłączony).
ŚLEDZENIE PRZEBIEGU PROGRAMU
Po zainicjowaniu sesji debuggera śledzenie wykonania programu odbywa się w sposób uzależniony od poleceń programisty. Dwa najprostsze sposoby polegają na zainicjowaniu poleceń:
Trace into (przez naciśnięcie k1awisza F7),
Step over (przez naciśnięcie klawisza F8).
Pierwsze z tych poleceń powoduje wykonanie instrukcji w bieżącym wierszu wykonawczym, zaznaczonym na ekranie przez podświetlenie. Jeśli instrukcją tą jest wywołanie procedury, to nastąpi przejście do tej procedury i ustalenie bieżącego wiersza wykonawczego na słowie kluczowym begin, rozpoczynającym treść danej procedury. W przypadku wywołania metody postępowanie jest analogiczne.
Polecenie Step over, które może być zainicjowane z dowolnego miejsca systemu Turbo Pascal przez naciśnięcie klawisza F8, powoduje także wykonanie instrukcji znajdującej się w bieżącym wierszu wykonawczym. Zasadnicza różnica pomiędzy tym poleceniem a poleceniem Trace into występuje w przypadku, gdy bieżącą instrukcją jest wywołanie procedury (metody). Nie następuje tu ustalenie początku treści procedury (metody) jako bieżącego wiersza wykonawczego, lecz wykonanie całej procedury (metody). Po tej operacji debugger przyjmuje jako bieżącą pozycję wykonawczą instrukcję następującą po instrukcji wywołania procedury (metody).
W sesji debuggera program może być wykonany tylko do określonego miejsca, a ściślej do miejsca aktualnego położenia kursora. W tym celu należy w tekście programu, znajdującego się w edytorze, przesunąć w zwykły sposób kursor do określonego miejsca, po czym zainicjować polecenie Go to cursor opcji Run. Polecenie to może być zainicjowane z dowolnego miejsca systemu Turbo Pascal przez naciśnięcie klawisza F4.
USTANAWIANIE PUNKTÓW KONTROLNYCH
Podczas sesji umiejscawiania i usuwania usterek można w programie ustanowić punkty kontrolne. W punktach kontrolnych wykonywanie programu jest przerywane i debugger oczekuje na dalsze polecenia. Należy zaznaczyć, że punkty kontrolne ustanowione w programie istnieją tylko podczas sesji debuggera i nie są zapamiętywane w zbiorze .EXE zapisywanym na dysku.
W celu ustanowienia w programie punktu kontrolnego należy w zwykły dla trybu edycji sposób przesunąć kursor do danego miejsca programu i zainicjować polecenie Toggle breakpoint (przez wybór w opcji Break/Watch lub naciśnięcie klawiszy Ctrl-F8). Wiersz programu, ustanowiony jako punkt kontrolny, zostanie na ekranie podświetlony (kolorem czerwonym na ekranie monitora kolorowego).
W programie można ustanowić do 21 punktów kontrolnych. Wiersz programu, będący takim punktem, musi przy tym zawierać przynajmniej jedną instrukcję. Punktów kontrolnych nie można zatem ustanawiać w wierszach pustych, zawierających tylko komentarze, dyrektywy kompilatora deklaracje i definicje stałych, typów, zmiennych i etykiet oraz nagłówki programu, modułów, procedur lub funkcji. Niezastosowanie się do tej reguły powoduje wyświetlenie (w trakcie wykonywania programu) komunikatu:
↑ Invalid Breakpoint |
Ignore, Erase, Clear all bad, Skip all bad |
Po wyświetleniu takiego komunikatu należy nacisnąć jeden z następujących klawiszy:
I (Ignore) - zignorowanie punktu kontrolnego,
E (Erase) - usunięcie punktu kontrolnego,
C (Clear all bad) - usunięcie wszystkich błędnych punktów kontrolnych,
S (Skip all bad) - przeskakiwanie przez wszystkie błędne punkty kontrolne.
We wszystkich przypadkach po wykonaniu podanej czynności wykonywanie programu jest wznawiane.
Jeśli do okienka Watch wprowadzono jakieś zmienne lub wyrażenia, to po zatrzymaniu w punkcie kontrolnym wykonywania programu zostaną wyświetlone ich aktualne wartości.
Do usunięcia wszystkich punktów kontrolnych, ustanowionych w programie, służy polecenie Clear all breakpoints w opcji Break/Watch. Przeglądania punktów kontrolnych programu dokonuje się przez sukcesywne inicjowanie polecenia View next breakpoint (także w opcji Break/Watch), które przesuwa kursor z jego aktualnego położenia do najbliższego, następnego punktu kontrolnego.
KONTROLOWANIE POSREDNICH WARTOSCI ZMIENNYCH, STRUKTUR DANYCH I WYRAŻEŃ
Przebieg wykonania programu może być kontrolowany przez śledzenie zmian wartości zmiennych, struktur danych i wyrażeń. Podczas wykonywania programu, możliwa jest też modyfikacja (zmiana) wartości zmiennych.
Do kontrolowania zmian wartości wspomnianych elementów służy okienko podglądania (okienko Watch), do którego należy wprowadzić badane zmienne, struktury danych i/lub wyrażenia. Operację tę przeprowadza się za pomocą polecenia Add watch, które może być zainicjowane przez odpowiedni wybór w opcji Break /Watch lub przez naciśnięcie (w dowolnym miejscu systemu Turbo Pascal) klawiszy Ctrl-F7.
MODYFIKOWANIE WARTOŚCI ZMIENNYCH
Jednym z poleceń dostępnych w opcji Debug jest Evaluate, służące do wyświetlania aktualnych wartości zmiennych i wyrażeń oraz do modyfikowania (zmieniania) wartości zmiennych. Polecenie Evaluate może być zainicjowane przez naciśnięcie klawiszy Ctrl-F4.
W wyniku zainicjowania polecenia Evaluate na ekranie ukaże się okienko z trzema podokienkami (polami) zatytułowanymi Evaluate, Result i New value. Pierwsze pole (Evaluate) zawiera zawsze podświetlone słowo z aktualnej pozycji kursora w tekście znajdującym się w edytorze. Przepisanie do tego pola dalszej części tekstu uzyskuje się przez naciśnięcie klawisza →. Zawartość pola Evaluate może być redagowana w identyczny sposób jak okienka Add watch.
Po naciśnięciu klawisza Enter aktualna wartość stałej, zmiennej lub wyrażenia, znajdującego się w polu Evaluate, zostanie wyświetlona w polu Result (wynik). Jeśli wyświetlana wartość nie mieści się w całości w tym polu, to w celu jej przesunięcia w lewo lub w prawo należy posłużyć się klawiszami Tab, →, ←, Home lub End.
Trzecie pole, New value (nowa wartość), służy do modyfikowania (zmieniania) wartości zmiennej wprowadzonej w polu Evaluate. Do pola New value można wprowadzić stałą, identyfikator innej zmiennej lub nawet wyrażenie, przy czym w każdym przypadku wynik musi być typu zgodnego ze zmienną wprowadzoną w polu Evaluate. Jeśli zmienna ta nie posiada lokalizacji w pamięci, to w polu Result zostanie wyświetlony komunikat:
Cannot be modified (zmienna nie może być zmodyfikowana).
Innymi komunikatami, które mogą pojawić się w polu Result na skutek wprowadzenia błędnego elementu w polu New value, są:
Type mismatch (błędny typ),
Constant out of range (wartość stałej poza zakresem),
Cannot evaluate this expression (obliczenie wartości wyrażenia nie jest możliwe).
Do poruszania się pomiędzy trzema polami okienka, tj. Evaluate, Result i New value, służą klawisze ↑ i ↓.
WYŚWIETLANIE LISTY ODWOŁAŃ DO FUNKCJI, PROCEDUR I METOD ORAZ ICH ODSZUKIWANIE W PROGRAMIE
Podczas zatrzymania przebiegu wykonania programu, np. na skutek ustanowienia punktu kontrolnego, można wyświetlić listę wszystkich odwołań do funkcji, procedur i metod, prowadzących do bieżącego wiersza wykonawczego programu. Do tego celu służy polecenie Call stack (w opcji Debug), które z dowolnego miejsca systemu Turbo Pascal może być zainicjowane przez naciśnięcie klawiszy Ctrl-F3.
Zaawansowane programy pascalowe składają się zwykle z dużej liczby metod, procedur i funkcji, które na ogół są zapisane w różnych zbiorach dyskowych. Po skompilowaniu programu daną metodę, procedurę lub funkcję można odszukać przez zainicjowanie polecenia Find procedure (przez odpowiedni wybór w opcji Debug). Po zainicjowaniu tego polecenia na ekranie zostanie wyświetione okienko postaci:
Enter procedure name ------_ |
do którego należy wpisać nazwę poszukiwanej funkcji, procedury lub metody, po czym nacisnąć klawisz Enter. Spowoduje to przejście do trybu edytowania i usytuowanie kursora w wierszu zawierającym słowo kluczowe begin, rozpoczynające część wykonawczą wyspecyfikowanej funkcji, procedury lub metody. Jeśli funkcja, procedura lub metoda o podanej nazwie znajduje się w zewnętrznym zbiorze dyskowym, dołączanym do programu za pomocą dyrektywy kompilatora I, to zbiór ten zostanie najpierw wprowadzony do edytora, po czym nastąpi wspomniane usytuowanie kursora.
Polecenie Find procedure nie powoduje zmiany aktualnego stanu sesji debuggera. Oznacza to, że jeśli wykonanie programu zostało zatrzymane w pewnym miejscu, to po wykonaniu rozważanego polecenia, polecenie Trace into (klawisz F7) nie spowoduje wykonania żadnej instrukcji w odszukanej procedurze (tj. w miejscu aktualnego położenia kursora), lecz wykonana zostanie instrukcja znajdująca się w bieżącym wierszu wykonawczym.
Ponieważ polecenie Find procedure powoduje usytuowanie kursora na początku części wykonawczej funkcji, procedury lub metody, więc wykonanie po nim polecenia Go to cursor (klawisz F4) spowoduje wykonanie programu od bieżącego wiersza wykonawczego do wspomnianego początku.
ZAKONCZENIE SESJI UMIEJSCAWIANIA I USUWANIA USTEREK PROGRAMOWYCH
Sesję umiejscawiania i usuwania usterek obsługiwaną przez debugger (wbudowany w system Turbo Pascal) należy zakończyć poleceniem Program reset. Polecenie to dostępne jest w opcji Run; może też być zainicjowane z dowolnego miejsca systemu Turbo Pascal przez naciśnięcie klawiszy Ctrl-F2.
Wykonanie polecenia Program reset powoduje zwolnienie pamięci przydzielonej podczas sesji przez program użytkownika i pamięci wykorzystywanej przez i debugger, zamknięcie wszystkich otwartych plików oraz inicjuje debugger do następnego przebiegu, tj. do rozpoczęcia sesji z innym programem.
1
Języki i metody programowania
8