Jak cofnąć się w debugerze Eclipse?

129

Czy można wykonać odwrotne wykonanie w debugerze Eclipse? Bieżący projekt, nad którym pracuję, wymaga co najmniej 5 sekund na odczytanie i zainicjowanie danych z pliku, zanim cokolwiek będzie można zrobić. Jeśli przekroczę poziom debuggera, muszę zakończyć program i ponownie uruchomić, a to zajmuje sporo czasu.

Jason
źródło

Odpowiedzi:

136

Możesz użyć polecenia Eclipse drop to frame, aby ponownie wprowadzić bieżącą metodę od góry. Ale nie rozwinie żadnych zmian stanu, które miały miejsce, więc może nie działać w zależności od rodzaju używanej metody.

Innym naprawdę fajnym narzędziem, które faktycznie pozwala ci cofać się i naprzód w czasie, jest Omniscient Debugger . Działa poprzez instrumentowanie klas, które są ładowane do modułu ładującego klasy, dzięki czemu może rejestrować wszystko, co robi Twój kod. Potrafi robić bardzo fajne rzeczy, na przykład odpowiadać „kiedy, gdzie i dlaczego temu polu przypisano aktualną wartość?”. Interfejs użytkownika jest raczej niezgrabny i może mieć trudności z obsługą dużych baz kodu, ale w niektórych przypadkach może naprawdę zaoszczędzić dużo czasu.

Aktualizacja : Chronon dostarcza produkt komercyjny, który określa jako „DVR dla Java”, który wydaje się robić wiele takich samych rzeczy jak ODB.

Matt McHenry
źródło
@Matt McHenry Próbowałem użyć ODB1.5; z samodzielnym programem java, ale nie jestem pewien, jak go uruchomić? Czy masz jakieś zasoby inne niż witryna ODB wyjaśniające kroki, aby działała niezależnie i z Eclipse?
Ayusman,
@Ayusman: nie, przepraszam, nie mam nic do przekazania poza tym, co jest na stronie ODB. Nie zdziwiłbym się, gdyby to nie działało między innymi z nowszymi formatami plików .class. :(
Matt McHenry
Ciekawa odpowiedź!
KrishPrabakar
Wygląda na to, że witryna Omnscient Debugger została przeniesiona do domeny.
Thorbjørn Ravn Andersen
45

Poza tym, co zostało wspomniane we wcześniejszych odpowiedziach - tj. Funkcja upuszczania do ramki Eclipse w widoku debugowania , która ponownie uruchamia debugowanie wcześniej w ramce stosu (ale nie przywraca danych globalnych / statycznych) i debuger Wszechwiedzący , który jest nieco surowy i nie tak bardzo ewoluuje - istnieje kilka narzędzi opartych na Eclipse, których można użyć do „cofnięcia się” w czasie wykonywania:

JIVE rozszerza debugger Eclipse Java o możliwość rejestrowania stanów programów. Perspektywa JIVE zawiera przydatne diagramy UML, które są aktualizowane podczas działania programu. Diagramy te zapewniają przegląd stanu aplikacji (diagram obiektów) i śladu stosu (diagram sekwencji). Możesz zapytać o zapamiętany ślad i cofnąć się i naprzód w czasie i zobaczyć odpowiednie diagramy.

Diver rejestruje tylko wywołania metod i tak naprawdę nie rejestruje stanów programów, takich jak JIVE. Każde zdarzenie wywołania metody jest przechowywane w celu późniejszego pobrania i analizy. Rozszerza konfiguracje Java Run i Debug głównie w celu określenia filtrów. Śledzenie można wstrzymać / wznowić / przefiltrować w czasie wykonywania. Po zarejestrowaniu perspektywa nurka może wyświetlić ją w interaktywnym diagramie sekwencji.

JIVE i Diver to projekty open source wydane na podstawie badań naukowych. Od listopada 2012 roku oba projekty są aktywne.

Chronon jest produktem komercyjnym, ale ma darmowe licencje dla studentów i projektów open source. Z tego, co twierdzi ich strona internetowa, jest to prawdopodobnie najbardziej wszechstronny rejestrator, ponieważ jest w stanie odtworzyć zapisaną historię, przechodzić do przodu i do tyłu, umożliwiając, jak mówią, debugowanie w czasie. Również Eclipse nie jest potrzebne do nagrywania.

Wszystkie te wtyczki są dość chciwe w zasobach, więc najlepiej mieć maszynę o dobrej specyfikacji i używać ich funkcji filtrowania. Zdecydowanym warunkiem pomyślnego ich uruchomienia jest rozszerzenie przestrzeni sterty w eclipse.ini .

W moim przypadku próbowałem użyć JIVE i Diver do debugowania programu parsującego XML, ale zawsze kończyło się to zamrożeniem zaćmienia z powodu braku zasobów. Diver może być trudny do uruchomienia na 64-bitowym systemie Linux , działa na 32- bitowym systemie Ubuntu i prawdopodobnie na innych 32-bitowych dystrybucjach korzystających z tych wskazówek . Diver działa na Windowsie, jeszcze lepiej na Windows 64-bit + 64-bit JVM, w przeciwnym razie będziesz ograniczony do maksymalnej przestrzeni sterty 1,3-1,6 Gb w 32-bitowych oknach . JIVE działa świetnie na moim 64-bitowym Linuksie i wydaje się działać dobrze na innych platformach.

fmjrey
źródło
Diver zostało przerwane
merours
12

Tak , Eclipse CDT obsługuje funkcję historycznego debuggera.

Otwórz konfigurację debugowania -> Debugger -> Włącz odwrotne debugowanie podczas uruchamiania .

Niż możesz nacisnąć shift+F5lub, shift+F6aby cofnąć się F5lub zrobić krok F6do przodu.

Siergiej
źródło
1
Czy ta opcja istnieje we wszystkich wersjach Eclipse? Jestem oszołomiony, jeśli mogę to znaleźć gdziekolwiek.
EngineerBetter_DJ
1
Jego funkcja GDB sourceware.org/gdb/wiki/ReverseDebug obsługiwana w Eclipse przez to bugs.eclipse.org/bugs/show_bug.cgi?id=258284 żądanie. Cóż, przypuszczam, że odpowiedź brzmi tak od 2009 roku.
Siergiej
Jest dostępny w CDT.
Siergiej
Jestem programistą Java, więc zgaduję, że CDT nie będzie dla mnie zbyt przydatne?
EngineerBetter_DJ
@Sergei Robię to pod Windows 7 SP1 ze starą wersją Springsource. Aby włączyć debugowanie odwrotne, musisz najpierw debugować jako-> Konfiguracje debugowania-> Główne. U dołu strony znajduje się program uruchamiający procesy. Zostanie wyświetlony komunikat „Korzystanie ze standardowego programu uruchamiającego proces tworzenia” oraz hiperłącze do „Wybierz inny ...”. Kliknij to i upewnij się, że zaznaczone jest „Użyj ustawień specyficznych dla konfiguracji”, a następnie wybierz „GDB (GSF) Utwórz program uruchamiający procesy” i kliknij OK. U dołu głównej zakładki będzie teraz wyświetlany komunikat „Korzystanie z programu uruchamiającego tworzenie procesów GDB (GSF)”.
Sammy
5

Jestem stronniczy, ale Chronon robi dokładnie to, czego szukasz.

Upuszczenie do ramki nie jest dokładnie cofnięciem się, ponieważ jeśli metoda zmieni cokolwiek na stercie, nie zostanie to przywrócone.

pdeva
źródło
1
Czy Chronon pozwala ci to robić w czasie rzeczywistym? Rozumiem, że najpierw musisz nagrać sesję za pomocą chrononu, a następnie możesz cofnąć się w tej sesji. Czy to nie jest tak dobre, jak ponowne uruchomienie aplikacji? A może czegoś mi brakuje…
Raam
2
tak, musisz najpierw nagrać swoją aplikację, a następnie możesz ją debugować w dowolnym momencie po nagraniu. Różni się od ponownego uruchomienia aplikacji, ponieważ nie trzeba wykonywać wszystkich kroków, aby odtworzyć błąd. Wszystko, co musisz zrobić, to raz zarejestrować błąd, a następnie możesz spojrzeć na niego w dowolnym momencie debugowania, używając tylko nagrania. Nie potrzebujesz żadnej części oryginalnego środowiska do odtwarzania nagrania.
pdeva
Czy Chronon działa w środowisku dokera? Mojej eclise nie ma na lokalnym ..
Choi
3

Szukałem tej funkcji również w zaćmieniu. Wiem, że studio wizualne to potrafi. Właściwie możesz przeciągnąć bieżący znacznik linii i upuścić w dowolnym miejscu z powrotem w kodzie. Nie jestem pewien, czy zmiany w zmiennych można cofnąć. Ale mimo to jest bardzo przydatny i oszczędza dużo czasu. Czekałem na to w zaćmieniu bardzo długo.

Bruno VA Pinheiro
źródło
1

Pytanie nie określa języka Eclipse, a wiele odpowiedzi zakłada Javę.

Jeśli używasz C ++ i GCC z debugerem GDB, Eclipse Run->Move to Linewykonuje zadanie i działa jak instrukcja Visual Studio Set Next . W tym przypadku Eclipse korzysta z możliwości GDB.

Jeśli korzystam z Javy, nie znam sposobu na to za pomocą Eclipse lub Netbeans, chociaż inne odpowiedzi sugerowały wtyczki. Eclipse ma polecenie „upuść do ramki”, które działa dla Javy w mojej wersji (Juno SR1). Jeśli zmodyfikuję i zapiszę kod w funkcji w trybie debugowania, wiersz wykonania automatycznie przesunie się na początek bieżącej funkcji i będę mógł kontynuować z tego miejsca. To nie to samo, co określenie linii, ale to coś.

GravityWell
źródło