Debugger

 

Używając możliwości debuggera możemy określić, m.in., kiedy wstrzymać wykonywanie i wyświetlić informacje. Np. możemy żądać, żeby wykonywanie programu wstrzymało się po każdej „instrukcji” lub tylko w niektórych punktach podglądania (spypoint). Jest pięć rodzajów punktów wstrzymania: call (przed wykonywaniem), exit (po wykonywaniu), redo (przed nawracaniem), fail (po porażce), exception (po złapaniu wyjątku).

 

Podstawowym poleceniem debuggera jest trace, który wstrzymuje wykonywanie programu po każdej instrukcji i pozwala użytkownikowi decydować co dalej robić. (Do wyłączenia trace, używamy notrace.)

 

Format komunikatów debuggera jest postaci:

 

N S    23     6 Call: T foo(hello,there,_123) ?

 

-         N jest używany tylko dla punktów wstrzymania typu Exit. Jest wyświetlony jako ? i określa czy foo/3 może nawrócić i znaleźć inne rozwiązania. Takie informacje mogą być przydatne dla ulepszenia programu kiedy możemy usunąć zbędne punkty nawrotu.

-         S jest wskaźnik punktu podglądania (spypoint indicator). Może być pusty  lub +, *, #.

-         Pierwsza liczba oznacza krok wywołania (czyli ilość wykonanych wywołań minus 1). Druga liczba oznacza głębokość wywołania (czyli ilość bezpośrednich poprzedników).

-         Następne słowo określa rodzaj punktu wstrzymania (Call, Exit, Redo, Fail, lub Exception).

-         T oznacza powód wstrzymania. Normalnie jest pusty.

-         Zapytanie jest wyświetlone, aby użytkownik może zbadać bieżący stan wykonywania.

-         Znak zapytania oznacza, że system oczekuje akcji od użytkownika. Dopuszczalne akcje są opisane tu. (Jako przykład, użytkownik może żądać, żeby system nie wyświetlał komunikatów do chwili wracania do pewnego punktu.)

 

Jeśli checemy, żeby system wstrzymywał się tylko w niektórych punktach, możemy używać punktów podglądania (spypoints). Punkty podglądania (spypoints) są określone poleceniem:

     :- spy nazwa_predykatu.

ewentualnie z arnością, lub

     :- spy [lista_nazw_predykatów].

 

Punkty podglądania są usunięte poleceniami

     :- nospy nazwa_predykatu.

     :- nospy [lista_nazw_predykatów].

     :- nospyall.

 

Jeśli chcemy, żeby system wstrzymywał się przy tylko punktach wstrzymania pewnych rodzajów (np. call i exit), to możemy użyć polecenie:

     :- leash([lista_rodzajów_punktów_wstrzymania]).

Do wyłączenia:

     :- leash(full).