SOISK - SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE
Tomasz Puchała

DEBUGGER W TURBO PASCALU

„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 war­toś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 pole­cenia dla debuggera mogą być zainicjowane w zwykły sposób, tzn. przez przesu­nię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 sy­stemu 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 syntaktycz­nych 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 niezmier­nie 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 pli­ków, przygotowanie do rozpoczęcia no­wej sesji)

·     Run/Go to cursor              F4                 zainicjowanie sesji debuggera i wykonanie programu z zatrzymaniem w wierszu za­wierającym kursor

·     Run/Trace into                 F7                 zainicjowanie sesji debuggera i wykonanie bieżącej instrukcji programu (jeśli instrukcją tą jest wywołanie procedu­ry, 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 procedu­ry 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                        progra­mie ź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                                                                                           pro­gramie

·     Debug/Integrated            -                   określenie stosowania debuggera

           debugging                                    wewnętrz­nego

·     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. Ta­blica ta jest bazą danych o wszystkich stosowanych w programie identyfikatorach (stałych, typach, zmiennych, procedurach i funkcjach) z numerami wier­szy, w których one występują. Oprócz tego wygodnie jest polecić kompilatorowi utworzenie tablic symboli lokalnych, które zawierać będą analogiczne informa­cje o identyfikatorach lokalnych w treści każdej procedury i funkcji. Oba polecenia mogą być ustanowione w menu systemu (Options/Compiler/Debug infor­mation i Options/Compiler/Local symbols) lub bezpośrednio w programie za po­mocą 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 (przyjmo­wane jest to standardowo przez system). W przypadku, gdy sesja będzie prze­prowadzona przez debugger zewnętrzny (może nim być Turbo Debugger l.5 firmy Borland International), należy włączyć, tj. ustalić na On, parametr Stand­alone 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ń:

n Trace into (przez naciśnięcie k1awisza F7),

n 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 analo­giczne.

 Polecenie Step over, które może być zainicjowane z dowolnego miejsca sy­stemu 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 usta­lenie 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ła­nia 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 prze­rywane 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, zosta­nie na ekranie podświetlony (kolorem czerwonym na ekranie monitora koloro­wego).

     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, zawiera­ją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 trak­cie 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 progra­mu 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 je­go aktualnego położenia do najbliższego, następnego punktu kontrolnego.

 

KONTROLOWANIE POŚREDNICH 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 pod­glądania (okienko Watch), do którego należy wprowadzić badane zmienne, struk­tury 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) klawi­szy 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 pozy­cji 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 Re­sult 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 wpro­wadzenia 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 ustanowie­nia 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 miej­sca 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 wspom­niane 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 pole­cenia 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 (wbudo­wany w system Turbo Pascal) należy zakończyć poleceniem Program reset. Pole­cenie 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. 

Ta strona internetowa została utworzona bezpłatnie pod adresem Stronygratis.pl. Czy chcesz też mieć własną stronę internetową?
Darmowa rejestracja