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).