2017-02-08 72 views
5

Hmm ... Mój nauczyciel, niektórzy z moich kolegów z klasy i ja zamierzamy zbudować projekt Debugger. Mamy nadzieję, że nasz debugger jest interaktywny, to znaczy, kiedy kody są wpisane, wynik zostanie wyświetlony kilka sekund później, a wynik zmienia się, gdy zmienia się kod wejściowy. Z drugiej strony, podczas pracy, możemy cofnąć do poprzedniej linii lub punktów przerwania.Jaka jest zasada "Time Travel Debugger"?

Zgodnie ze słowami mojego nauczyciela podczas programowania program będzie zajmował się techniką "Time Travel Debugging". Przeszukałem projekt utrzymywany przez innych, ale słabo rozumiem kod i nie ma żadnych informacji o tej technice w żadnym z tych plików README.

referencyjny: https://github.com/mattgodbolt/compiler-explorer

+5

Czy twój nauczyciel jest fanem Dr. Who? "Kompilacja w czasie podróży" nie jest terminem standardowym. Wygląda to na wyrażenie, które wymyślili. Możesz zapytać ich, co przez to rozumieją. –

+0

Chodzi o to, czy można ustawić punkt przerwania w debugerze, a następnie krok * do tyłu * poprzez instrukcje, aby zobaczyć stan środowiska wykonawczego w punktach * przed * punktem przerwania. – Pointy

+0

I tak naprawdę nie ma to wiele wspólnego z * kompilatorami *, naprawdę; to rzecz systemu runtime. Cóż, domyślam się, * że kompilator może generować kod, aby utrzymać jakiś kontekst kontroli, ale wydaje się to dziwnym sposobem robienia rzeczy. – Pointy

Odpowiedz

6

Jest to najbardziej powszechnie znany jako „czas debugowania podróży” i jest często związane z „Functional Reactive Programowanie”. (To są terminy, które możesz łatwo przeszukać.) Na blogu Elm Language znajduje się kilka przystępnych dokumentów (na przykład time travel made easy), ale proponuję zacząć od początku, zamiast nurkować w środku i podróżować w czasie zrozumienie (niektóre gry słowne :-))

Ściślej rzecz biorąc, debugowanie czasu podróży jest czymś, co dzieje się w czasie wykonywania, ale jest znacznie łatwiejsze, jeśli programujesz w języku funkcjonalnym (takim jak Haskell, Elm, OCAML lub różne inne, dla których zostały zaimplementowane debuggery czasowe), a kompilowanie tych języków (tak, są one kompilowane) zawiera kilka interesujących koncepcji.

Elm kompiluje do javascript, co czyni względnie łatwym eksperymentowanie.

Baw się z projektem.

+0

AFAIK może być używany z całym czysto funkcjonalnym programowaniem, dlaczego ograniczasz go do funkcjonalności? reaktywny? –

+0

@Guy: Nie jestem. W rzeczywistości może być również używany do programowania niefunkcjonalnego; istnieje debugger czasu podróży dla javascript, który zdecydowanie nie jest funkcjonalnym językiem programowania. Powiedziałem, że często wiąże się to z FRP, który miał na celu wskazanie OP w celu wyszukania większej ilości informacji. Dodałem OCAML do listy języków funkcjonalnych w drugim akapicie. – rici

+0

Możesz również wspomnieć o [Visual Studio IntelliTrace] (https://msdn.microsoft.com/en-us/library/dd264915.aspx) –

1

debugowania czas podróży jest również znany jako odwrotnej debugowania. W kategoriach laika można wielokrotnie debugować te same linie (bez zatrzymywania/restartowania aplikacji).

Na przykład debugujesz metodę, która rzuciła wyjątek w linii 10, aby znaleźć przyczynę wyjątku, możesz ponownie uruchomić tę metodę z poprzedniego punktu, powiedzmy linii 4 bez restartowania całego procesu debugowania. wszystko działa w czasie rzeczywistym i jest bardzo wydajne.

Użyłem tej funkcji w Visual Studio.