Debugging Rails with PRY Debugger

Część 3 w serii obszerny przewodnik po debugowaniu Rails

Rails Debugging with Pry

Jeśli jeszcze nie wiesz, co to jest sesja debugowania, pomyśl o tym jak o otwarciu konsoli Rails w wybranym punkcie ścieżki wykonania.

zakładam, że poniżej zainstalowałeś klejnoty PRY-debugger i PRY-stack_explorer.

w dowolnym momencie kodu źródłowego (w tym w pobranym kodzie klejnotów dołączonych do pliku Gemfile i wygodnie otwieranych w edytorze tekstu z otwartym Pakietem gem_name) możesz wstawić powiązanie linii.wścibski. Ilekroć interpreter Ruby wykonuje tę linię, zatrzymuje to, co robi i otwiera w tym momencie sesję PRY REPL. Jeśli wchodziłeś w interakcję ze stroną internetową za pośrednictwem przeglądarki, musisz przełączyć programy na kartę konsola terminala, w której działał Twój serwer Rails, aby zobaczyć sesję Pry.

dla jasności w wyjaśnieniu, co ma nastąpić, zamieszczam tutaj fragment kodu.

def place_everyone_on_sale Seller.all.each do |seller| place_on_sale(seller) endenddef place_on_sale(seller) binding.pry # Execution will stop here. new_products = generate_products(seller) new_product.advertise new_productsenddef generate_products(seller) seller.documents.each do |document| document.place_online if document.releasable endend

w konsoli Pry masz wszystkie wymienione już funkcje do sprawdzania stanu lub introspekcji programu za pomocą produktu LS. Debugowanie dodaje nawigację stosu w ramkach stosu. Lets lie a little and define a stack frame as a ” REPL console open up at any of the possible points along the stack trace Why might we want to navigate stack frame? Aby jeszcze bardziej wskazać nasz błąd, szukając bardziej konkretnych przyczyn. Robimy to czasami, szukając momentu, w którym pewna zmienna zmieni wartość (np. plik cookie zostanie ustawiony). Innym razem obserwujemy przepływ egzekucji, porównując to, czego oczekujemy z tym, co widzimy. Na przykład możesz zauważyć, że została wykonana Niewłaściwa gałąź konstrukcji if-else.

po wykonaniu place_everything_on_sale w powyższym fragmencie kodu, zostaniesz uruchomiony do Pry sesji w ramach metody place_on_sale i przedstawiony z pytaniem, co chcesz zrobić dalej.

  • polecenie step kontynuuje wykonywanie, przenosząc użytkownika do metody w następnym wierszu, zmieniając ramkę stosu na znajdującą się wewnątrz tej metody. Inaczej mówiąc, to idzie głębiej. Zgodnie z naszym przykładem kodu, uruchomienie step spowoduje przejście do metody generate_products, w którym zostaniesz zapytany, co chcesz zrobić dalej.

  • „wszedłeś” do metody generate_products z step powyżej, ale teraz zdecydowałeś, że chcesz przejść do końca metody generated_products bez debugera pytającego o wybór polecenia nawigacji po każdej linii. Wpisz finish, aby wykonać, dopóki bieżąca ramka stosu nie uruchomi każdej linii, zamknie się i zwróci wartość, tym samym wynurzając się o jeden poziom, który przenosi się z powrotem do ramki stosu, z której wcześniej wyszedłeś. Idąc za przykładem, wracamy do metody place_on_saledo punktu, w którym interpreter ocenił generated_products.

  • następne polecenie uruchamia bieżącą linię I przechodzi do następnej linii lub metody w bieżącym kontekście, tzn. postępuje bez zmiany ramki stosu. Sformułowane w inny sposób, kontynuuj jedną linię w dół bieżącej metody bez wchodzenia głębiej. Patrząc na przykład kodu (i udając, że właśnie zrestartowaliśmy nasz program, uruchomiliśmy place_everything_on_sale i świeżo otworzyliśmy sesję Pry), wpisując next całkowicie wykona generate_products bez upuszczania Cię do jego wewnętrznych elementów, a następnie przypisze wartość zwracaną do zmiennej new_products. Nexty są większe niż kroki, lub w kategoriach Rails, następne kroki has_many. Cały kod w metodzie generate_products (co w przeciwnym razie byłoby wieloma krokami) został zakończony jednym użyciem polecenia next. Następną decyzją nawigacyjną będzie krok, następnie new_product.advertise.

  • porzuć sesję Pry i kontynuuj wykonywanie programu jak zwykle za pomocą polecenia continue. Jeśli Tłumacz napotka inne powiązanie.polecenie pry (które stanie się, gdy wywołasz metodę place_everyone_on_sale powyżej), uruchomi metodę place_on_sale raz dla każdego sprzedawcy, dlatego otwierając sesję Pry przy każdej iteracji. Może to być niesamowicie irytujące, ponieważ twój program zatrzyma się i będziesz musiał poruszać się po debuggerze za każdym razem, więc prawdopodobnie będziesz chciał wpisać exit-program, aby anulować efekt następującego powiązania.pry wypowiedzi, bez, że tak powiem wyjścia z programu Rails.

  • zobacz kod źródłowy metody, w której aktualnie znajdujesz się: whereami Świetne do potwierdzenia, że jesteś we właściwej klasie lub do sprawdzenia, gdzie skończyłeś po przejściu przez kilka klatek w sesji debugowania.

  • Drukuj i nawiguj stos wywołań gdy w Rubim pojawia się wyjątek, wypisuje on ślad stosu wszystkich metod wywołanych przed tym wyjątkiem. Czasami chcesz zobaczyć dotychczasowy ślad stosu, mimo że nie ma żadnego wyjątku. Dzięki jednemu konkretnemu rozszerzeniu pry zainstalowanemu przez dodanie klejnotu pry-stack_explorer, możesz to zrobić za pomocą show-stack -v. To polecenie wyświetla ślad stosu, wskazując bieżącą ramkę za pomocą strzałki. Możesz przejść do innej klatki z up lub ” up {N}”, np. up 3, aby przejść do góry trzech klatek, czyli przenieść REPL do kontekstu metody, która wywołała metodę (i tak dalej…), która ostatecznie wywołała metodę, w której jesteś obecnie umieszczony. Wpisz show-stack, aby zobaczyć, do którego miejsca w stosie zostały przeniesione, a w dół, aby przenieść ramki w przeciwnym kierunku.

  • Zakończ kontekst z wartością: Czasami chcesz manipulować przepływem programu, zwracając określoną wartość z sesji Pry. Dla przykładu, wyobraź sobie, że masz linię kodu, która czyta first_name = binding.pry. Zmienna first_name jest przypisana do wyjścia z sesji Pry i można ustawić tę wartość na jack z exit "jack".

czasami chcesz dokładnie określić, kiedy Wiązanie.pry otworzy pry-sesję. Robię to z warunkami kodu Ruby:

 binding.pry if session == true binding.pry if @first_name == "Jack" binding.pry if iteration > 4

Część 3 w serii obszerny przewodnik po debugowaniu Rails Rails Debugging with Pry Jeśli jeszcze nie wiesz, co to jest sesja debugowania, pomyśl o tym jak o otwarciu konsoli Rails w wybranym punkcie ścieżki wykonania. zakładam, że poniżej zainstalowałeś klejnoty PRY-debugger i PRY-stack_explorer. w dowolnym momencie kodu źródłowego (w tym w pobranym kodzie klejnotów dołączonych…

Część 3 w serii obszerny przewodnik po debugowaniu Rails Rails Debugging with Pry Jeśli jeszcze nie wiesz, co to jest sesja debugowania, pomyśl o tym jak o otwarciu konsoli Rails w wybranym punkcie ścieżki wykonania. zakładam, że poniżej zainstalowałeś klejnoty PRY-debugger i PRY-stack_explorer. w dowolnym momencie kodu źródłowego (w tym w pobranym kodzie klejnotów dołączonych…

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.