Debugowanie skryptów

 

System skryptów w Altium Designer oferuje w pełni funkcjonalne środowisko debugowania. Debugger skryptów pomaga identyfikować i usuwać błędy w skryptach, udostępniając zestaw zautomatyzowanych narzędzi oraz panele informacyjne.

Błędy skryptu

Do typowych błędów należą nieprawidłowe metody, źle umieszczone operatory grupowania, niezgodne typy, błędy logiki oraz literówki. Gdy system skryptów napotka błąd, debugger wstrzyma skrypt i wyświetli okno dialogowe błędu wskazujące problem.

Poniższy przykład pokazuje skrypt z brakującym znakiem kończącym oraz odpowiadający mu komunikat w oknie dialogowym błędu.

 Debugger wstrzyma skrypt w odpowiedzi na błędy kompilacji lub błędy czasu wykonania.

Po zamknięciu okna dialogowego błędu kod można poprawić i ponownie uruchomić skrypt. Jeśli skrypt trzeba zatrzymać – na przykład podczas przechodzenia krok po kroku – użyj polecenia Stop (Run » Stop, Ctrl+F3) lub przycisku ( na pasku narzędzi Script Debug).

Zdarzają się sytuacje, gdy błąd może spowodować zablokowanie skryptu w nieskończonej pętli i skrypt przestaje odpowiadać. Aby rozwiązać ten problem, naciśnij Ctrl+Pause/Break skróty klawiszowe, aby przerwać pętlę skryptu.

Debugowanie skryptu

W systemie skryptów dostępny jest zestaw narzędzi pomagających w debugowaniu skryptów. Obejmują one m.in. ustawianie wielu punktów przerwania w skrypcie, użycie panelu Watch List do monitorowania wartości zmiennych, korzystanie z zakładek w celu sprawniejszego poruszania się oraz funkcje „krok do” i „krok przez”, aby śledzić przebieg skryptów.

Na przykład podczas sprawdzania wartości zmiennych i wyrażeń w skrypcie można użyć następujących funkcji:

► Zobacz Script Editor Tools, aby uzyskać informacje o korzystaniu z narzędzi edytora podczas debugowania skryptów.

Jeśli debugujesz skrypt działający na otwartym dokumencie – na przykład podczas używania interfejsu IPCB_Board do pobierania danych z dokumentu PCB – edytor skryptów nie będzie w stanie wykryć go jako aktywnego dokumentu. W takim przypadku zapisz wprowadzone zmiany, a następnie uruchom skrypt z poziomu samego aktywnego dokumentu (File » Run Script).

Śledzenie (Tracing)

Aby pomóc w znalezieniu i usunięciu nieznanego błędu w skrypcie, można wstawić do skryptu serię punktów przerwania, aby wstrzymywać kod w wielu miejscach i sprawdzać wartości zmiennych oraz wyrażeń.

W dowolnym momencie, gdy skrypt jest wstrzymany, można go także przesuwać o jedną funkcjonalną linię naraz, korzystając z funkcji śledzenia/kroków debuggera. W ten sposób punkt przerwania może posłużyć do wstępnego zatrzymania skryptu w interesującym obszarze, a następnie można przechodzić linia po linii przy użyciu funkcji śledzenia. Proces wykonywania skryptu linia po linii nazywa się śledzeniem (tracing) lub przechodzeniem krokowym (script stepping).

Debugger skryptów udostępnia polecenia związane ze śledzeniem – krok do (Run » Step Into) oraz krok przez (Run » Step Over). Pozwala to śledzić przebieg skryptu i analizować jego zachowanie podczas debugowania kodu skryptu.

Polecenia debugowania dostępne w Run menu.
Polecenia debugowania dostępne w Run menu.

Polecenie Step Into

Proces Step Into wykonuje skrypt, uruchamiając po jednym instrukcji naraz. Polecenie jest dostępne z Run menu, z powiązanego przycisku na pasku narzędzi Script Debug () lub za pomocą F7 skrótu klawiszowego.

Jeśli wykonywana instrukcja wywołuje inną procedurę, wejście w tę instrukcję przenosi sterowanie do pierwszej linii w wywołanej procedurze. Podświetlenie w kolorze groszkowej zieleni w edytorze wskazuje linię kodu, na której aktualnie znajduje się skrypt. Proces przechodzenia krokowego skryptu można anulować poleceniem Run » Stop, skrótem Ctrl+F3 lub przyciskiem na pasku narzędzi ().

Polecenie Step Over

Proces Step Over jest podobny do Step Into, z tą różnicą, że jeśli bieżąca instrukcja jest wywołaniem innej procedury, cała wywołana procedura zostanie wykonana bez zatrzymywania, zamiast śledzenia jej krok po kroku. Polecenie jest dostępne z Run menu, z powiązanego przycisku () lub za pomocą F8 skrótu klawiszowego.

To polecenie jest przydatne, gdy ustalono, że dana called procedura nie jest przyczyną problemu w bieżącej procedurze, i pozwala uniknąć niepotrzebnego śledzenia wywołanej procedury linia po linii – ta procedura jest „przeskakiwana” (stepped over).

Użyj polecenia Run » Run To Cursor z głównych menu (skrót: Ctrl+F9) aby wykonać skrypt do miejsca kursora. Skrypt zatrzymuje się na tej linii tak, jakby napotkał punkt przerwania, po czym można go uruchomić lub wykonywać krokowo od tego miejsca.

Panel Call Stack

Panel Call Stack służy do wyświetlania łańcucha procedur i funkcji, które doprowadziły do bieżącego punktu wykonania w debugowanym skrypcie.

Panel Call Stack
Panel Call Stack

Podczas debugowania krokowego skryptu panel będzie pokazywał nazwę każdej funkcji lub procedury, do której wchodzisz.

Gdy napotkane zostanie wywołanie innej funkcji lub procedury, panel pokaże nazwę tej dodatkowej funkcji/procedury w momencie wejścia do niej. Ponieważ funkcja/procedura jest wywoływana z wnętrza innej funkcji/procedury, pierwotna funkcja/procedura nadal jest wyświetlana w panelu.

W efekcie tworzony jest „stos wywołań” (call stack), pokazujący relacje pomiędzy kolejnymi wywołaniami funkcji/procedur potomnych. Pierwotna funkcja/procedura znajduje się na dole stosu, a każda kolejno wywołana funkcja/procedura jest umieszczana nad nią, aż do aktualnie wykonywanej funkcji/procedury na szczycie stosu.

Gdy wykonanie skryptu wychodzi z podfunkcji/podprocedury i wraca do funkcji/procedury wywołującej, ta pierwsza zostaje usunięta ze stosu, a funkcja/procedura wywołująca staje się elementem na szczycie stosu.

Dwukrotne kliknięcie wpisu w panelu spowoduje przejście do odpowiadającej mu linii skryptu, w której następuje wywołanie wybranej funkcji lub procedury. Linia zostanie podświetlona kolorem skojarzonym z błędami skryptów, a w prawym marginesie zostanie wyświetlony znacznik błędu skryptu. Służy to wyłącznie do celów wyróżnienia. Zniknie po kliknięciu w dokument i w żaden sposób nie wpływa na sesję debugowania.

Wyjątki i komunikaty

Jak to zwykle bywa w przypadku wszystkich projektów programistycznych, tworzenie i debugowanie kodu skryptu niekoniecznie kończy się na „działającym” skrypcie. W praktycznym użyciu skrypt prawdopodobnie napotka nieprzewidziane błędy lub może nie dostarczać oczekiwanych rezultatów.

Na szczęście istnieje kilka sposobów wykorzystania systemu skryptów do obsługi wyjątków wykonania oraz przekazywania użytkownikowi informacji zwrotnej o działaniu skryptu.

Obsługa wyjątków

W DelphiScript słowo kluczowe try wprowadza instrukcję try-except lub instrukcję try-finally. Te dwie instrukcje są powiązane, ale służą różnym celom.

Try Finally

W obsłudze Try-Finally instrukcje w bloku finally są zawsze wykonywane – niezależnie od tego, czy w bloku try wystąpił błąd wyjątku. Użyj bloku try-finally, aby zwolnić obiekty tymczasowe lub inne zasoby oraz wykonać czynności porządkowe.

Reset(F);
Try
  // process file F
Finally
  CloseFile(F);
End;

Try Except

Użyj instrukcji Try-Except, aby przechwytywać zgłaszane wyjątki i wykonywać powiązany kod obsługi błędów. Na przykład można przechwycić konkretny wyjątek i zaktualizować log lub otworzyć opisowe okno dialogowe błędu. Wyjątek w bloku try powoduje wykonanie bloku except.

W poniższym przykładzie procedura ApplyOffset jest wywoływana z odpowiednimi parametrami z procedury DefineOffset. Procedura wykonuje proste obliczenie dzielenia (na zmiennych Ydim i Zdim ) i zgłasza wynik (Offset) w standardowym oknie dialogowym.

Procedure ApplyOffset(Ydim, Zdim);
Var
   Offset;
Begin;
   Try
      Offset := Ydim div Zdim;
      ShowInfo('Calculated Offset = ' + IntToStr(Offset));
   Except
      ShowWarning('Entered Z dimension must be greater than zero.');
   End;
End;

Procedure DefineOffset;
Begin;
   ApplyOffset(32, 4);
End;

Dla parametrów ApplyOffset pokazanych powyżej (32,4) wykonany skrypt wyświetli obliczony wynik przy użyciu procedury ShowMessage, jak pokazano poniżej.

Alternatywnie, zmiana przekazywanych parametrów na 32,0 (ApplyOffset(32, 0);) wywołuje wyjątek dzielenia przez zero w obliczeniu Offset, uruchamiając blok obsługi Except. Wykorzystuje on procedurę ShowWarning do wyświetlenia odpowiedniego okna dialogowego Warning .

W trybie debugowania edytora skryptów wyjątek wstrzyma wykonanie skryptu po zamknięciu okna dialogowego Error . Użyj polecenia Run lub Step Into, aby kontynuować.

Raise

Założeniem w powyższej prostej procedurze obsługi błędów jest to, że wyjątek jest zgłaszany w odpowiedzi na błąd dzielenia przez zero, ale oznacza to, że inne typy wyjątków nie będą poprawnie raportowane przez tekst ostrzeżenia w oknie dialogowym. W tym przykładzie jest to jednak najbardziej prawdopodobny błąd wyjątku, z jakim można się spotkać.

Z punktu widzenia użytkownika pożądana jest mimo wszystko jakaś forma specyficznego wykrywania błędów. W DelphiScript nie jest obsługiwane delphi’owe słowo kluczowe On (do przechwytywania określonego typu wyjątku), ale instrukcji Raise można użyć wewnątrz bloku Except , aby ponownie zgłosić ostatni wyjątek (niezależnie od jego typu).

Try
   Offset := Ydim div Zdim;
   ShowInfo('Calculated Offset = ' + IntToStr(Offset));
Except
   Raise;
End;

W ten sposób, gdy zasadnicza część kodu procedury znajduje się w bloku try instrukcji try-except, wszystkie wyjątki mogą być raportowane przez instrukcję Raise . Zwróć uwagę, że okno dialogowe wyjątku będzie raportować jedynie ogólne komunikaty o błędach, a nie informacje specyficzne dla skryptu.

   

Raise można użyć bez parametrów, aby ponownie zgłosić ostatni wyjątek, albo z parametrem typu string, aby przekazać konkretny komunikat błędu.

Raise Raise można także użyć do wywołania wyjątku w odpowiedzi na konkretne testy, na przykład poprzez zastosowanie prostych instrukcji if-then lub case.

Procedure ApplyOffset(Ydim, Zdim);
Var
   Offset;
Begin;
   if Zdim > Ydim then
      Begin;
         Raise('Z dimension must be smaller than Y dimension.');
      End;
   Offset := Ydim div Zdim;
   ShowInfo('Calculated Offset = ' + IntToStr(Offset));
End;

Tutaj, jeśli parametr Zdim z powyższego przykładu jest większy niż parametr Ydim, zgłaszany jest wyjątek (z komunikatem).

Błędy w skryptach VB

Implementacja VBScript w silniku skryptów Altium Designer ma wbudowane funkcje, które można wykorzystywać w projektach skryptów VBScript, takie jak funkcja MsgBox .

Instrukcja On Error może być używana podczas przechwytywania błędów w skryptach VB. Więcej informacji na temat przechwytywania błędów można znaleźć w dokumentacji Microsoft VBScript.

Komunikaty

Zasadniczo komunikaty są podstawowym sposobem usprawniania działania skryptu z perspektywy użytkownika.

Komunikaty mogą dostarczać alertów o wyjątkach lub wskazywać informacje o przebiegu działania i ostrzeżenia, a także mogą być wstawiane do procedur skryptu, które dotyczą danych wejściowych, obliczeń, operacji na plikach lub dowolnej procedury, w której przydatny byłby wgląd w przebieg działania.

Okna dialogowe komunikatów

Oprócz podstawowego okna dialogowego komunikatu dostępnego w systemie skryptowym (ShowMessage), dostępny jest zestaw specyficznych okien dialogowych, które zapewniają dopasowaną informację zwrotną dla użytkownika.

Obejmują one procedury komunikatów, takie jak:

  • ShowError
  • ShowException
  • ShowInfo
  • ShowWarning
  • i inne..

Panel Messages

Panel Messages  w Altium Designer może być przydatnym narzędziem do debugowania skryptów, ale może też służyć do prezentowania użytkownikowi bieżącego strumienia użytecznych informacji w postaci komunikatów.

Panel Messages jest obiektem Workspace Manager, do którego uzyskuje się dostęp z interfejsu Message Manager. Panel Messages może być używany w skrypcie do wyświetlania stanów zmiennych i właściwości (a także dowolnych innych danych) zarówno na potrzeby debugowania, jak i informacji zwrotnej dla użytkownika, jak pokazano w poniższym przykładzie.

Procedure CreateMessages;
var
   WS : IWorkSpace;
   MM : IMessagesManager;
Begin
   WS := GetWorkSpace;           // obtain Workspace Manager interface
   MM := WS.DM_MessagesManager;  // obtain Message Manager interface
   
   MM.ClearMessages;             // initialize

   MM.BeginUpdate;
   // add relevant messages here using MM.AddMesssage procedures
   MM.EndUpdate;

   WS.DM_ShowMessageView;         // display messages
End;
AI-LocalizedTłumaczenie SI
Jeśli znajdziesz błąd, zaznacz tekst/obraz i naciśnij Ctrl + Enter aby wysłać nam wiadomość.
Feature Availability

The features available to you depend on which Altium solution you have – Altium Develop, an edition of Altium Agile (Agile Teams or Agile Enterprise), or Altium Designer (on active term).

If you don’t see a discussed feature in your software, contact Altium Sales to find out more.

Legacy Documentation

Altium Designer documentation is no longer versioned. If you need to access documentation for older versions of Altium Designer, visit the Legacy Documentation section of the Other Installers page.

Content