Czy mogę znaleźć wartość zwracaną przed powrotem podczas debugowania w Eclipse?

99

Czy można zobaczyć zwracaną wartość metody po uruchomieniu wiersza i zanim wskaźnik instrukcji powróci do funkcji wywołującej?

Debuguję kod, którego nie mogę zmodyfikować (czytaj: nie chcę ponownie kompilować biblioteki innej firmy) , a czasami przeskakuje do kodu, którego nie mam źródła lub wyrażenie powrotu ma efekty uboczne, które uniemożliwiają mi istnienie można po prostu uruchomić wyrażenie na karcie Wyświetl .

Często wartość zwracana jest używana w instrukcji złożonej, więc widok Zmienne nigdy nie pokaże mi wartości (stąd chcę zobaczyć wynik, zanim sterowanie powróci do funkcji wywołującej).

AKTUALIZACJA: Nie mogę użyć przeglądarki wyrażeń, ponieważ w instrukcji występują efekty uboczne.

RodeoClown
źródło
7
Dlatego przełączyłem się na wspólnotową wersję IntelliJ - ludzie z Eclipse po prostu nie zdają się rozumieć, jakie to ważne. (Jeśli kiedykolwiek to naprawią, przełączę się z powrotem w dniu premiery).
@James Mitchell to świetny pomysł na wtyczkę. Dodam to do listy rzeczy do zrobienia i spróbuję to zrobić, kiedy znajdę czas (nie wkrótce)
IAdapter
@ user672348 Ale jak to zrobić w IntelliJ IDEA?
Alexey Tigarev
@AlexeyTigarev: IIRC, jest wyświetlane po wykonaniu „Step Return” (lub odpowiednika).
Blaisorblade
1
Przygotuj się na Eclipse Oxygen (data premiery w połowie 2017 r.). Kamień milowy M2 obejmuje tę funkcję .
Abdull

Odpowiedzi:

36

Ta funkcja została dodana do Eclipse w wersji 4.7 M2 w ramach błędu Eclipse 40912 .

Aby z niego skorzystać:

  • przejdź przez returninstrukcję (używając „Step Over” lub „Step Return”)
  • teraz pierwszy wiersz w widoku zmiennej pokaże wynik instrukcji return, jako „[instrukcja xxx] zwróciła:”

Szczegółowe informacje można znaleźć w Eclipse Project Oxygen (4.7) M2 - New and Noteworthy .

sleske
źródło
Ja też. Brakuje mi tej funkcji podczas korzystania z Eclipse.
m24p
1
Ten błąd Eclipse został następnie ponownie otwarty pod koniec 2009 roku . Jednak wciąż czekam na poprawkę, bez przypisania nikogo i bez celu. :)
Mark A. Fitzgerald
1
Zostało to naprawione w ostatnich wersjach Eclipse 4.7 (od M2)
AbdullahC,
1
Kilka informacji na temat korzystania z tej poprawki można znaleźć w New And Noteworthy for 4.7 M2. Poszukaj „Wynik metody po operacjach krokowych” tutaj: eclipse.org/eclipse/news/4.7/M2
Joshua Goldberg,
@JoshuaGoldberg: Dziękuję za zwrócenie uwagi - zredagowałem to w odpowiedzi.
sleske
34

Znalazłem do tego naprawdę dobry skrót. Wybierz wyrażenie zwracające wartość i naciśnij

Ctrl + Shift + D

Spowoduje to wyświetlenie wartości instrukcji return. Jest to bardzo pomocne w przypadkach, gdy nie możesz lub nie chcesz zmieniać tylko w celu debugowania.

Mam nadzieję że to pomoże.

Uwaga: nie testowałem tego z bibliotekami innych firm, ale działa dobrze dla mojego kodu. Przetestowano to w środowisku Eclipse Java EE IDE dla programistów WWW. Wersja: Juno Service Release 1

Satish
źródło
4
+1, ponieważ działa to nie tylko w przypadku wartości zwracanych, ale ogólnie w przypadku wyrażeń. O wiele wygodniejsze niż korzystanie z karty wyrażenia. Należy zauważyć, że powoduje to wykonanie kodu, więc jeśli ma efekty uboczne, uważaj. help.eclipse.org/indigo/…
koza
1
Ctrl + Shift + Ibył również pomocny dla mnie.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
2
jak wspomniano w @goat, wykonuje to kod wiele razy, więc na przykład, jeśli funkcja to zrobiła return System.currentTimeMillis();, otrzymasz inny wynik niż funkcja faktycznie zwrócona!
Brad Parks,
Odpowiednik na Apple machine?
Adrien Be
Jest to problematyczna rada - spowoduje to ponowną ocenę wyrażenia, co może mieć katastrofalne skutki, jeśli ma skutki uboczne.
sleske
5

Dlatego zawsze trzymam się następującego schematu metod:

MyReturnedType foo() {
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;
}

Moje zasady:

  1. Tylko jedna instrukcja powrotu, tylko na końcu metody (ostatecznie dozwolone po niej)
  2. Zawsze miej lokalny wywoływany wynik, który przechowuje zwróconą wartość, zaczynając od wartości domyślnej.

Oczywiście najbardziej trywialne gettery są zwolnione.

zvikico
źródło
3
Hej zvikico - kiedy pracuję nad własnym kodem, zwykle używam podobnego wzorca. Niestety, mój problem polega na tym, że używam kodu, który nie jest przeze mnie napisany ani modyfikowalny. : S
RodeoClown,
Ja też to robię, ale SonarLint narzeka ... teraz mam
wątpliwości
@WitoldKaczurba to twoja opinia i to dobrze. Po prostu zaakceptuj, że istnieją inne opinie i okaż szacunek tym, którzy to robią.
zvikico
Cześć zvikco. Dzięki za wiadomość. Akceptuję, że istnieją różne podejścia, ale odniosłem się do pmd.sourceforge.io/pmd-4.3.0/rules/… . Pozdrawiam
Witold Kaczurba
2

Ciekawi mnie również odpowiedź na to pytanie.

W przeszłości, gdy miałem do czynienia z biblioteką innej firmy, to, co robiłem, to tworzenie klasy opakowującej lub klasy podrzędnej, która jest delegowana do klasy nadrzędnej i przeprowadzałem debugowanie w klasie opakowującej / podrzędnej. Wymaga to jednak dodatkowej pracy.

DJ.
źródło
1
Problem z tym rozwiązaniem (poza tym, który zauważyłeś w kwestii dodatkowej pracy) polega na tym, że działa tylko wtedy, gdy nie masz wielu klas / metod głęboko w zewnętrznej bibliotece. Ale jest to przydatne, gdy masz do czynienia z zewnętrzną warstwą metod.
RodeoClown
0

Trudny. Z mojego doświadczenia, poza Eclipse, wynika, że ​​jeśli możesz potrzebować zobaczyć zwracaną wartość, najlepiej jest przypisać ją do zmiennej lokalnej w funkcji, aby instrukcja return była prosta, return varname;a nie return(some * expression || other);. Jednak nie jest to dla ciebie strasznie pomocne, ponieważ mówisz, że nie możesz (lub nie chcesz) modyfikować lub nawet ponownie kompilować kodu. Więc nie mam dla ciebie dobrej odpowiedzi - być może musisz ponownie rozważyć swoje wymagania.

Jonathan Leffler
źródło
W moim kodzie generalnie mam etap pośredni, więc mogę sprawdzić wynik, ale część kodu, którego używam, ma zbyt duże obciążenie organizacyjne, aby go zmodyfikować (szczególnie jeśli biblioteka zostanie zaktualizowana, tak naprawdę nie chcę utrzymywać wersji rozwidlonej tylko do debugowania).
RodeoClown,
0

W zależności od instrukcji return możesz podświetlić zwracane wyrażenie iz menu po kliknięciu prawym przyciskiem myszy powinno być coś takiego jak "ocena wyrażenia" (nie mam teraz przed sobą zaćmienia, ale to coś takiego ). Pokaże ci, co zostanie zwrócone.

stephmara
źródło
4
Problem polega na tym, że gdy ocena funkcji zwrotu ma skutki uboczne (na przykład tworzone są wpisy bazy danych), ocena wyrażenia zwracanego zmieni stan systemu. Jednak dzięki za sugestię.
RodeoClown,
0

Jest to nieco naciągane, ale ponieważ nie wydaje się, aby istniał prosty sposób:

Możesz użyć AspectJ do oprzyrządowania JAR z aspektami, które przechwytują wartość zwracaną przez interesujące Cię metody. Zgodnie z dokumentacją Eclipse, programy AspectJ mogą być debugowane tak jak inne programy.

Istnieją dwie opcje splatania klas bez ponownej kompilacji biblioteki:

  • Tkanie po kompilacji, jeśli przetwarzanie binarnego pliku JAR jest dopuszczalne;

  • Tkanie w czasie ładowania, które wymaga aktywacji agenta tkactwa w maszynie wirtualnej.

Zobacz dokumentację eclipse (łącze powyżej), a także podręcznik środowiska programistycznego AspectJ .

Olivier
źródło