Począwszy od pry0.12.2 jednak nie ma poleceń, takich jak nawigacja next, breakitp Niektóre inne perełki dodatkowo zapewnić to, patrz na przykład pry-byedebug.
Polecam również używanie Pry (zdecydowanie zmieniacz życia!) .. Po zainstalowaniu i wymaganiu w programie ustawienie punktu przerwania jest tak łatwe, jak pisanie binding.pry. Zawiera również uzupełnianie kolorów, przeglądanie dokumentacji i możliwość dynamicznej edycji i ponownego wczytywania metody.
Andrea Fiore
5
Strona domowa firmy Pry jest dostępna tutaj: pryrepl.org .
shadowbq
4
Pry/ byebugsą świetne, ale nie jako pierwszy krok podczas debugowania. W większości przypadków zgłoszenie wyjątku za pomocą raise object.inspectrozwiąże problem szybciej niż otwarcie sesji IRB. Zalecam używanie debugerów konsoli tylko wtedy, gdy proste rozwiązania, takie jak zgłoszenie wyjątku, nie są w stanie rozwiązać problemu.
Kelsey Hannan
3
Czy istnieje sposób na kodowanie jednoetapowe za pomocą pry? Nie mogłem znaleźć, jak to zrobić; i tego właśnie oczekuję od debuggera.
-rdebug to śmieć. I niekonserwowany. Użyj Podważ (zobacz drugą odpowiedź).
Snowcrash
3
@SnowCrash - Dlaczego mówisz, że -r debugto bzdury?
sid smith
8
z -rdebug: nie ma potrzeby zmiany pliku źródłowego w celu debugowania
germanlinux
2
W przypadku nowej aplikacji Ruby / Rails poprawną odpowiedzią jest Pry. Ale spędziłem ponad godzinę, próbując znaleźć starą wersję Pry, która działałaby na aplikacji Rails 2.2 z określoną wersją facetsw wymaganiach dotyczących klejnotów, ale zakończyło się to niepowodzeniem. Dla starożytnych aplikacji Railsowych ruby-debugjest trochę paskudny, ale spełnia swoje zadanie.
Abe Voelker
56
Zgodnie z zaleceniami: użyj podważenia! Mogę się tylko co do tego zgodzić.
pry jest znacznie lepszą odpowiedzią niż irb.
Musisz dodać
require 'pry'
do pliku źródłowego, a następnie wstaw punkt przerwania w kodzie źródłowym, dodając
binding.pry
w miejscu, w którym chcesz się przyjrzeć rzeczom (to jest jak wyzwalanie punktu przerwania w klasycznym środowisku IDE)
Gdy Twój program trafi do
binding.pry
linii, zostaniesz wrzucony prosto do podważonej odpowiedzi, z całym kontekstem twojego programu pod ręką, dzięki czemu możesz po prostu eksplorować wszystko dookoła, badać wszystkie obiekty, zmieniać stan, a nawet zmieniać kod w locie.
Uważam, że nie możesz zmienić kodu metody, w której się obecnie znajdujesz, więc nie możesz niestety zmienić kolejnej linii do wykonania. Ale dobry kod ruby i tak ma tendencję do składania się z jednej linii ;-)
Debugowanie przez wywołanie wyjątków jest znacznie łatwiejsze niż mrużenie oka przezprintinstrukcje dziennika, a w przypadku większości błędów jest zwykle znacznie szybsze niż otwieranie debugera irb, takiego jakprylubbyebug. Te narzędzia nie zawsze powinny być pierwszym krokiem.
Szybkie debugowanie Ruby / Rails:
1. Szybka metoda: Podnieś Exceptionto i .inspectjego wynik
Najszybsza droga do debugowania Ruby (zwłaszcza Rails) kod jest raisewyjątek wzdłuż ścieżki wykonanie kodu podczas wywoływania .inspectna metody lub obiektu (np foo):
raise foo.inspect
W powyższym kodzie, raisewyzwala Exceptionże wstrzymuje wykonanie kodu , i zwraca komunikat o błędzie, który dogodnie zawiera .inspectinformacje na temat obiektu / metody (tj foo) w wierszu, który próbujesz do debugowania.
Technika ta jest przydatna do szybkiego zbadania obiektu lub metody ( np. Czy to jest nil? ) I do natychmiastowego potwierdzenia, czy wiersz kodu jest w ogóle wykonywany w danym kontekście.
2. Zastępstwo: użyj debuggera Ruby IRB, takiego jak byebuglubpry
Dopiero po uzyskaniu informacji o stanie przepływu wykonywania kodu należy rozważyć przejście do debugera ruby gem irb, takiego jak prylub w byebugktórym można głębiej zagłębić się w stan obiektów na ścieżce wykonywania.
Ogólne porady dla początkujących
Kiedy próbujesz debugować problem, dobrą radą jest zawsze: Przeczytaj! @ # $ Ing Komunikat o błędzie (RTFM)
Oznacza to, że czytanie komunikatów o błędach dokładnie i całkowicie przed podjęciem działań, tak aby zrozumieć, co próbuje powiedzieć. Podczas debugowania podczas odczytywania komunikatu o błędzie zadaj następujące pytania mentalne w podanej kolejności :
Do jakiej klasy odnosi się błąd? (tj. czy mam poprawną klasę obiektu, czy jest to mój obiekt nil? )
Do jakiej metody odnosi się błąd? (tj. jest ich typem w metodzie; czy mogę wywołać tę metodę dla tego typu / klasy obiektu? )
Na koniec, korzystając z tego, co mogę wywnioskować z moich dwóch ostatnich pytań, jakie wiersze kodu powinienem zbadać? (pamiętaj: ostatnia linijka kodu w śladzie stosu niekoniecznie oznacza problem).
W śladzie stosu zwróć szczególną uwagę na linie kodu pochodzące z twojego projektu (np. Linie zaczynające się od, app/...jeśli używasz Railsów). W 99% przypadków problem dotyczy Twojego własnego kodu.
Aby zilustrować, dlaczego tłumaczenie w tej kolejności jest ważne ...
Np. Komunikat o błędzie Ruby, który dezorientuje wielu początkujących:
Wykonujesz kod, który w pewnym momencie jest wykonywany jako taki:
@foo=Foo.new
...@foo.bar
i otrzymujesz błąd, który mówi:
undefined method "bar" for Nil:nilClass
Początkujący widzą ten błąd i myślą, że problem polega na tym, że metoda barjest niezdefiniowana . To nie jest. W tym błędzie najważniejsza część to:
for Nil:nilClass
for Nil:nilClassoznacza, że @foojest zero! @foonie jest Foozmienną instancji! Masz przedmiot, który jest Nil. Kiedy widzisz ten błąd, to po prostu ruby próbuje ci powiedzieć, że metoda barnie istnieje dla obiektów tej klasy Nil. (no cóż! ponieważ próbujemy użyć metody dla obiektu klasy Foonie Nil).
Niestety, ze względu na sposób zapisu tego błędu ( undefined method "bar" for Nil:nilClass) łatwo jest dać się zwieść myśleniu, że ten błąd ma związek z barbytem undefined. Jeśli nie przeczytasz uważnie, ten błąd powoduje, że początkujący omyłkowo zagłębiają się w szczegóły barmetody Foo, całkowicie pomijając część błędu, która wskazuje, że obiekt jest niewłaściwej klasy (w tym przypadku: zero). To błąd, którego łatwo uniknąć, czytając w całości komunikaty o błędach.
Podsumowanie:
Zawsze uważnie przeczytaj cały komunikat o błędzie przed rozpoczęciem debugowania. Oznacza to: Zawsze najpierw sprawdź typ klasy obiektu w komunikacie o błędzie , a następnie jego metody , zanim zaczniesz szukać śladu stosu lub wiersza kodu, w którym uważasz, że może wystąpić błąd. Te 5 sekund może zaoszczędzić 5 godzin frustracji.
tl; dr: Nie mruż oczy na wydruki logów: zgłaszaj wyjątki lub używaj debuggera irb. Unikaj króliczych nory, uważnie czytając błędy przed debugowaniem.
Chociaż zgadzam się z tobą, że czytanie dzienników drukowania jest żmudne, myślę, że zalecenie nie używania debuggera w pierwszej kolejności jest bardzo złą radą. Dodanie punktu przerwania i wyzwolenie go jest dokładnie tym samym wysiłkiem, co zgłoszenie wyjątku, ale zapewnia pełny wgląd w aktualny stan aplikacji. Jeśli w wyniku sprawdzenia podejrzanego stanu pojawią się dodatkowe pytania, możesz interaktywnie przejść do szczegółów zamiast dodawać kolejny wyjątek i ponownie uruchamiać aplikację.
Patrick R.
2
@PatrickR. Z mojego doświadczenia wynika, że debuggery IRB nie są dobrym pierwszym krokiem, gdy nadal próbujesz drążyć dokładnie, gdzie w kodzie znajduje się problem. Dodawanie i usuwanie wielu punktów przerwania IRB zajmuje więcej czasu niż dodawanie wyjątków i nie daje jednoznacznych odpowiedzi na temat przepływu kontroli w kodzie w sposób, w jaki wyjątki mogą u początkujących wyeliminować złe założenia. Punkty przerwania IRB są również łatwe do zapomnienia, co powoduje zamieszanie, gdy żądania się zawieszają. Jeśli wiesz dokładnie, gdzie jest problem i chcesz zdebugować jego stan, zacznij od debugera IRB. Ale często to nieprawda.
Kelsey Hannan,
1
Ha! Czytanie komunikatów o błędach jest pomocne w przypadku Rubiego, ale w innych językach skryptowych? Nie mogę winić OP, że nawet nie zawracał sobie głowy.
kayleeFrye_onDeck
1
Moja początkowa reakcja była podobna do @PatrickR., Ale i tak spróbowałem. W końcu uważam, że to zła rada, a może w najlepszym świetle, rada dostosowana do innego przypadku użycia niż ja. W szczególności w przypadku, gdy (a) nie używa Rails i (b) mają zły wynik, ale nie ma błędów ani wyjątków, np. Kod oblicza liczbę, jest to po prostu błędna liczba. Próba iteracyjnego odgadnięcia, gdzie zrobić program, który w przeciwnym razie wykonałby awarię, jest strategią, ale wymaga więcej pracy, ponieważ muszę ciągle uruchamiać i ponownie uruchamiać. Każdy cykl ma swój własny czas uruchamiania, który jest zmarnowany.
Brick
20
Wydrukuj zmienne, jeśli to możliwe. (Nazywa się to debugowaniem printf) Możesz to zrobić uruchamiając
STDERR.puts x.inspect
lub
STDERR.puts "Variable x is #{x.inspect}"
Jeśli chcesz, aby było to łatwiejsze do wpisania , możesz użyć klejnotu wzorcowego .
Włącz ostrzeżenia. Jeśli używasz, rubyuruchom go za pomocą -wprzełącznika (np ruby -w script.rb.). Jeśli uruchamiasz go z irb i używasz wersji Ruby wcześniejszej niż 1.9.2, wpisz $VERBOSE = truena początku sesji. Jeśli pomylisz się w zmiennej instancji, po pojawieniu się ostrzeżeń otrzymasz
ostrzeżenie: zmienna instancji @valeusnie została zainicjowana
Podziel obszar problemu na pół i zobacz, która połowa zawiera problem. Następnie ponownie podziel tę połowę na pół i powtórz.
Jeśli odniesiesz sukces w przypadku binarnego cięcia, może się okazać, że jest jedna linia, która nie robi tego, czego oczekujesz. Na przykład
[1,2,3].include?([1,2])
daje wartość false, nawet jeśli można by pomyśleć, że zwróci true. W takim przypadku możesz zajrzeć do dokumentacji. Witryny internetowe zawierające dokumentację obejmują ruby-doc.org lub APIdock . W tym drugim przypadku piszesz include?obok lupy w prawym górnym rogu i wybierz to, include?co ma Arraypod nią (jeśli nie wiesz, jaką klasę[1, 2, 3] jest , wpisz [1, 2, 3].classirb), a otrzymasz ? (Array) , który opisuje, co robi.
Jeśli jednak dokumentacja nie pomoże, bardziej prawdopodobne jest, że uzyskasz dobrą odpowiedź, jeśli możesz zadać pytanie, w jaki sposób konkretna linia nie robi tego, co powinna, zamiast dlaczego cały skrypt nie robi tego, co powinno.
Następnie możesz zainstalować rozszerzenia za pomocą przeglądarki internetowej lub wewnątrz IDE; to jest dla wewnątrz IDE. Jeśli wybierzesz drugą opcję, możesz przejść tutaj . Przejdź do części vscode Extensions; możesz to zrobić na kilka sposobów, ale najbardziej przyszłościową metodą będzie prawdopodobnie uderzanie F1i wpisywanie, extdopóki nie stanie się dostępna opcja o nazwie Rozszerzenia: Zainstaluj rozszerzenia . Alternatywami są CtrlShiftxiz górnego paska menu,View->Extensions
Następnie będziesz potrzebować następujących rozszerzeń; nie są one w 100% konieczne, ale pozwolę ci zdecydować, co zachować po tym, jak trochę majstrujesz:
Rubin; autor rozszerzenia Peng Lv
rubin-rubocop; autor rozszerzenia misogi
rubinowa linter; autor rozszerzenia Cody Hoover
W katalogu twojego skryptu ruby utworzymy katalog za pomocą wiersza poleceń o nazwie, .vscodea tam będziemy tylko plik o nazwie, w launch.jsonktórym będziemy przechowywać kilka opcji konfiguracyjnych.
Prawdopodobnie będziesz chciał mieć możliwość umieszczania punktów przerwania w dowolnym miejscu; brak włączonej tej opcji może powodować zamieszanie. Aby to zrobić, przejdziemy do górnego paska menu i wybierzemy File->Preferences->Settings(lub Ctrl,) i przewiniemy, aż dojdziesz do Debugsekcji. Rozwiń go i poszukaj pola o nazwie "debug.allowBreakpointsEverywhere"- wybierz to pole, kliknij małą ikonę przypominającą ołówek i ustaw na true.
Po wykonaniu wszystkich tych zabawnych rzeczy powinieneś być w stanie ustawić punkty przerwania i debugować w menu podobnym do tego w połowie 2017 r. I ciemniejszym motywie: ze wszystkimi zabawnymi rzeczami, takimi jak stos wywołań, przeglądarka zmiennych itp.
Największe PITA to 1) zainstalowanie wymagań wstępnych i 2) Pamiętanie o skonfigurowaniu .vscode\launch.jsonpliku. Tylko # 2 powinien dodać bagaż do przyszłych projektów i możesz po prostu skopiować wystarczająco ogólną konfigurację, taką jak wymieniona powyżej. Prawdopodobnie jest bardziej ogólna lokalizacja konfiguracji, ale nie wiem od początku mojej głowy.
Teraz jest rok 2018 😉, ale niestety nadal nie można debugować testu jednostkowego przy użyciu wymienionych tutaj wtyczek… 😕 Dość smutne.
MonsieurDart
1
@MonsieurDart Kiedy to pisałem, było to przeznaczone do podstawowego debugowania skryptów Ruby. Nie znam niczego konkretnego na temat testów jednostkowych. Jeśli ta odpowiedź jest nieprawidłowa lub nieaktualna, daj mi znać, co wymaga uwagi i podaj wszelkie informacje, które mogą przyspieszyć ten proces.
kayleeFrye_onDeck
Hej @kayleeFrye_onDeck! Twoja odpowiedź jest świetna, całkowicie Ci to daję. Ale ostatnim razem, gdy sprawdzałem wtyczkę Ruby Peng Lv pod kątem VSC, nie udało mi się ustawić punktów przerwania w teście jednostkowym (ani w żadnym innym teście). Było to jedno ze znanych ograniczeń wtyczki. Myślę, że ludzie muszą to wiedzieć, zanim spróbują skonfigurować swoje wystąpienie VSC: zajmuje to dużo czasu, a dla wielu osób przeprowadzanie testów to numer jeden ze sposobów pisania i debugowania kodu. 😊
MonsieurDart
6
Gorąco polecam ten film, aby w tej chwili wybrać odpowiednie narzędzie do debugowania naszego kodu.
Wszystkie inne odpowiedzi dają już prawie wszystko ... Tylko mały dodatek.
Jeśli potrzebujesz więcej debuggera podobnego do IDE (nie-CLI) i nie boisz się używać Vima jako edytora, sugeruję wtyczkę Vim Ruby Debugger .
Jego dokumentacja jest dość prosta, więc kliknij link i zobacz. Krótko mówiąc, pozwala ustawić punkt przerwania w bieżącej linii w edytorze, przeglądać zmienne lokalne w sprytnym oknie podczas pauzy, przechodzić / przechodzić do - prawie wszystkie zwykłe funkcje debuggera.
Dla mnie używanie tego debuggera vim do debugowania aplikacji Railsów było całkiem przyjemne, chociaż bogate możliwości rejestratora Railsów prawie eliminują jego potrzebę.
następnie użyj dokładnie tak pry, jak zaznacz linię, w której chcesz przerwać:
require 'pry'; binding.pry
W przeciwieństwie wanilia pry jednak ten klejnot ma kilka kluczowych GDB-jak nawigacja poleceń takich jak next, stepi break:
breakSomeClass#run # Break at the start of `SomeClass#run`.breakFoo#bar if baz? # Break at `Foo#bar` only if `baz?`.break app/models/user.rb:15# Break at line 15 in user.rb.break14# Break at line 14 in the current file.
Dodam, że irbto świetne miejsce na start. Spróbuj użyć irb z małymi wątpliwymi fragmentami. Uwielbiam ruby-debug (ruby-debug19 dla Ruby 1.9+), ponieważ ułatwia zatrzymanie uruchomionego programu, sprawdzenie zmiennych, przejście do irb, a następnie kontynuowanie działania.
Tin Man
5
Aby łatwo debugować skrypt powłoki Ruby, po prostu zmień jego pierwszą linię z:
#!/usr/bin/env ruby
do:
#!/usr/bin/env ruby -rdebug
Następnie za każdym razem, gdy zostanie wyświetlona konsola debugera, możesz wybrać:
cdla Kontynuuj (do następnego wyjątku, punktu przerwania lub linii z:) debugger,
ruby-debug wygląda dość przestarzale. Repozytorium git dla ruby-debug ma tylko jedno zatwierdzenie w tym roku - czy nadal jest aktywnie obsługiwane?
Andrew Grimm
Wydaje się również, że jest zapakowany w rubin, co jest świetne, gdy jesteś w potrzebie. Świetna odpowiedź!
Breedly
5
Od wersji 2.4.0 Rubiego łatwiej jest rozpocząć sesję IRB REPL w środku dowolnego programu Ruby. Umieść te wiersze w punkcie programu, który chcesz debugować:
require 'irb'
binding.irb
Możesz uruchomić kod Ruby i wydrukować zmienne lokalne. Naciśnij Ctrl + D lub, quitaby zakończyć REPL i pozwolić programowi Ruby działać dalej.
Możesz także użyć putsi, paby wydrukować wartości z programu w trakcie jego działania.
Czy mamy sposób na debugowanie zewnętrznych bibliotek w RubyMine?
Am33d
2
debugowanie printf
Zawsze istniały kontrowersje wokół technik debugowania, niektórzy ludzie lubią debugować za pomocą instrukcji print, inni lubią kopać głęboko za pomocą debugera.
Sugerowałbym wypróbowanie obu podejść.
Właściwie jeden ze starych ludzi od Uniksa powiedział niedawno, że debugowanie printf było w niektórych przypadkach szybszym sposobem.
Ale jeśli jesteś nowy w jakiejś pracy i musisz zrozumieć dużą porcję kodu, to naprawdę przydatne jest przejście przez to, umieszczanie punktów przerwania tu i tam, i śledzenie, jak to działa.
Powinien dać ci trochę zrozumienia, jak tkany jest kod.
Jeśli jesteś nowy w oprogramowaniu innych ludzi, może ci to pomóc.
Szybko dowiesz się, czy sprytnie to ułożyli, czy to tylko kupa gówna.
Matką wszystkich debuggerów jest zwykły stary ekran wydruku. W większości przypadków prawdopodobnie chcesz sprawdzić tylko niektóre proste obiekty, szybki i łatwy sposób jest następujący:
@result= fetch_result
p "--------------------------"
p @result
Spowoduje to wydrukowanie zawartości @result na STDOUT z linią z przodu w celu łatwej identyfikacji.
Bonus, jeśli korzystasz z platformy obsługującej automatyczne ładowanie / ponowne ładowanie, takiej jak Rails, nie musisz nawet ponownie uruchamiać aplikacji. (O ile kod, który debugujesz, nie zostanie ponownie załadowany z powodu ustawień specyficznych dla platformy)
Uważam, że działa to dla mnie w 90% przypadków użycia. Możesz także użyć ruby-debug, ale uważam, że przez większość czasu jest to przesada.
Istnieje wiele debuggerów z różnymi funkcjami, na podstawie których dokonujesz wyboru. Moje priorytety były zadowalające z ruchami podważającymi, które były:
szybko zrozumiałe informacje, jak używać
intuicyjne kroki (jak łatwe wchodzenie w bloki)
„cofanie się” (ruchy podważania częściowo zaspokajają potrzebę)
Odpowiedzi:
Użyj Pry ( GitHub ).
Zainstaluj przez:
Następnie dodaj:
do swojego programu.
Począwszy od
pry
0.12.2 jednak nie ma poleceń, takich jak nawigacjanext
,break
itp Niektóre inne perełki dodatkowo zapewnić to, patrz na przykładpry-byedebug
.źródło
binding.pry
. Zawiera również uzupełnianie kolorów, przeglądanie dokumentacji i możliwość dynamicznej edycji i ponownego wczytywania metody.Pry
/byebug
są świetne, ale nie jako pierwszy krok podczas debugowania. W większości przypadków zgłoszenie wyjątku za pomocąraise object.inspect
rozwiąże problem szybciej niż otwarcie sesji IRB. Zalecam używanie debugerów konsoli tylko wtedy, gdy proste rozwiązania, takie jak zgłoszenie wyjątku, nie są w stanie rozwiązać problemu.pry
? Nie mogłem znaleźć, jak to zrobić; i tego właśnie oczekuję od debuggera.W Rubim:
następnie,
b <line>
: wstaw punkt przerwanian(ext)
lubs(tep)
ic(ontinue)
p(uts)
do wyświetlenia(jak debugowanie Perla)
W Railsach: uruchom serwer z
i dodaj
debugger
kod.źródło
-r debug
to bzdury?facets
w wymaganiach dotyczących klejnotów, ale zakończyło się to niepowodzeniem. Dla starożytnych aplikacji Railsowychruby-debug
jest trochę paskudny, ale spełnia swoje zadanie.Zgodnie z zaleceniami: użyj podważenia! Mogę się tylko co do tego zgodzić.
pry jest znacznie lepszą odpowiedzią niż irb.
Musisz dodać
do pliku źródłowego, a następnie wstaw punkt przerwania w kodzie źródłowym, dodając
w miejscu, w którym chcesz się przyjrzeć rzeczom (to jest jak wyzwalanie punktu przerwania w klasycznym środowisku IDE)
Gdy Twój program trafi do
linii, zostaniesz wrzucony prosto do podważonej odpowiedzi, z całym kontekstem twojego programu pod ręką, dzięki czemu możesz po prostu eksplorować wszystko dookoła, badać wszystkie obiekty, zmieniać stan, a nawet zmieniać kod w locie.
Uważam, że nie możesz zmienić kodu metody, w której się obecnie znajdujesz, więc nie możesz niestety zmienić kolejnej linii do wykonania. Ale dobry kod ruby i tak ma tendencję do składania się z jednej linii ;-)
źródło
Debugowanie przez wywołanie wyjątków jest znacznie łatwiejsze niż mrużenie oka przez
print
instrukcje dziennika, a w przypadku większości błędów jest zwykle znacznie szybsze niż otwieranie debugera irb, takiego jakpry
lubbyebug
. Te narzędzia nie zawsze powinny być pierwszym krokiem.Szybkie debugowanie Ruby / Rails:
1. Szybka metoda: Podnieś
Exception
to i.inspect
jego wynikNajszybsza droga do debugowania Ruby (zwłaszcza Rails) kod jest
raise
wyjątek wzdłuż ścieżki wykonanie kodu podczas wywoływania.inspect
na metody lub obiektu (npfoo
):W powyższym kodzie,
raise
wyzwalaException
że wstrzymuje wykonanie kodu , i zwraca komunikat o błędzie, który dogodnie zawiera.inspect
informacje na temat obiektu / metody (tjfoo
) w wierszu, który próbujesz do debugowania.Technika ta jest przydatna do szybkiego zbadania obiektu lub metody ( np. Czy to jest
nil
? ) I do natychmiastowego potwierdzenia, czy wiersz kodu jest w ogóle wykonywany w danym kontekście.2. Zastępstwo: użyj debuggera Ruby IRB, takiego jak
byebug
lubpry
Dopiero po uzyskaniu informacji o stanie przepływu wykonywania kodu należy rozważyć przejście do debugera ruby gem irb, takiego jak
pry
lub wbyebug
którym można głębiej zagłębić się w stan obiektów na ścieżce wykonywania.Ogólne porady dla początkujących
Kiedy próbujesz debugować problem, dobrą radą jest zawsze: Przeczytaj! @ # $ Ing Komunikat o błędzie (RTFM)
Oznacza to, że czytanie komunikatów o błędach dokładnie i całkowicie przed podjęciem działań, tak aby zrozumieć, co próbuje powiedzieć. Podczas debugowania podczas odczytywania komunikatu o błędzie zadaj następujące pytania mentalne w podanej kolejności :
nil
? )W śladzie stosu zwróć szczególną uwagę na linie kodu pochodzące z twojego projektu (np. Linie zaczynające się od,
app/...
jeśli używasz Railsów). W 99% przypadków problem dotyczy Twojego własnego kodu.Aby zilustrować, dlaczego tłumaczenie w tej kolejności jest ważne ...
Np. Komunikat o błędzie Ruby, który dezorientuje wielu początkujących:
Wykonujesz kod, który w pewnym momencie jest wykonywany jako taki:
i otrzymujesz błąd, który mówi:
undefined method "bar" for Nil:nilClass
Początkujący widzą ten błąd i myślą, że problem polega na tym, że metoda
bar
jest niezdefiniowana . To nie jest. W tym błędzie najważniejsza część to:for Nil:nilClass
for Nil:nilClass
oznacza, że@foo
jest zero!@foo
nie jestFoo
zmienną instancji! Masz przedmiot, który jestNil
. Kiedy widzisz ten błąd, to po prostu ruby próbuje ci powiedzieć, że metodabar
nie istnieje dla obiektów tej klasyNil
. (no cóż! ponieważ próbujemy użyć metody dla obiektu klasyFoo
nieNil
).Niestety, ze względu na sposób zapisu tego błędu (
undefined method "bar" for Nil:nilClass
) łatwo jest dać się zwieść myśleniu, że ten błąd ma związek zbar
bytemundefined
. Jeśli nie przeczytasz uważnie, ten błąd powoduje, że początkujący omyłkowo zagłębiają się w szczegółybar
metodyFoo
, całkowicie pomijając część błędu, która wskazuje, że obiekt jest niewłaściwej klasy (w tym przypadku: zero). To błąd, którego łatwo uniknąć, czytając w całości komunikaty o błędach.Podsumowanie:
Zawsze uważnie przeczytaj cały komunikat o błędzie przed rozpoczęciem debugowania. Oznacza to: Zawsze najpierw sprawdź typ klasy obiektu w komunikacie o błędzie , a następnie jego metody , zanim zaczniesz szukać śladu stosu lub wiersza kodu, w którym uważasz, że może wystąpić błąd. Te 5 sekund może zaoszczędzić 5 godzin frustracji.
tl; dr: Nie mruż oczy na wydruki logów: zgłaszaj wyjątki lub używaj debuggera irb. Unikaj króliczych nory, uważnie czytając błędy przed debugowaniem.
źródło
Wydrukuj zmienne, jeśli to możliwe. (Nazywa się to debugowaniem printf) Możesz to zrobić uruchamiając
lub
Jeśli chcesz, aby było to łatwiejsze do wpisania , możesz użyć klejnotu wzorcowego .
Włącz ostrzeżenia. Jeśli używasz,
ruby
uruchom go za pomocą-w
przełącznika (npruby -w script.rb
.). Jeśli uruchamiasz go z irb i używasz wersji Ruby wcześniejszej niż 1.9.2, wpisz$VERBOSE = true
na początku sesji. Jeśli pomylisz się w zmiennej instancji, po pojawieniu się ostrzeżeń otrzymaszZrozum pojęcie binarnego cięcia (poniższy cytat pochodzi z Practices of an Agile Developer )
Jeśli odniesiesz sukces w przypadku binarnego cięcia, może się okazać, że jest jedna linia, która nie robi tego, czego oczekujesz. Na przykład
daje wartość
false
, nawet jeśli można by pomyśleć, że zwrócitrue
. W takim przypadku możesz zajrzeć do dokumentacji. Witryny internetowe zawierające dokumentację obejmują ruby-doc.org lub APIdock . W tym drugim przypadku piszeszinclude?
obok lupy w prawym górnym rogu i wybierz to,include?
co maArray
pod nią (jeśli nie wiesz, jaką klasę[1, 2, 3]
jest , wpisz[1, 2, 3].class
irb), a otrzymasz ? (Array) , który opisuje, co robi.Jeśli jednak dokumentacja nie pomoże, bardziej prawdopodobne jest, że uzyskasz dobrą odpowiedź, jeśli możesz zadać pytanie, w jaki sposób konkretna linia nie robi tego, co powinna, zamiast dlaczego cały skrypt nie robi tego, co powinno.
źródło
usuwa wszystkie rzeczy
Witamy w 2017 ^ _ ^
Okay, więc jeśli nie jesteś przeciwny wypróbowaniu nowego IDE, możesz wykonać następujące czynności za darmo .
Szybkie instrukcje
launch.json
do korzystania"cwd"
i i"program"
pola za pomocą{workspaceRoot}
makra"showDebuggerOutput"
i ustaw je natrue
"debug.allowBreakpointsEverywhere": true
Szczegółowe instrukcje
vscode
; to nie to samo, co Visual Studio . Jest darmowy, lekki i ogólnie pozytywnie oceniany.View->Extensions
.vscode
a tam będziemy tylko plik o nazwie, wlaunch.json
którym będziemy przechowywać kilka opcji konfiguracyjnych.launch.json
zawartość{ "version": "0.2.0", "configurations": [ { "name": "Debug Local File", "type":"Ruby", "request": "launch", "cwd": "${workspaceRoot}", "program": "{workspaceRoot}/../script_name.rb", "args": [], "showDebuggerOutput": true } ] }
File->Preferences->Settings
(lub Ctrl,) i przewiniemy, aż dojdziesz doDebug
sekcji. Rozwiń go i poszukaj pola o nazwie"debug.allowBreakpointsEverywhere"
- wybierz to pole, kliknij małą ikonę przypominającą ołówek i ustaw natrue
.Po wykonaniu wszystkich tych zabawnych rzeczy powinieneś być w stanie ustawić punkty przerwania i debugować w menu podobnym do tego w połowie 2017 r. I ciemniejszym motywie: ze wszystkimi zabawnymi rzeczami, takimi jak stos wywołań, przeglądarka zmiennych itp.
Największe PITA to 1) zainstalowanie wymagań wstępnych i 2) Pamiętanie o skonfigurowaniu
.vscode\launch.json
pliku. Tylko # 2 powinien dodać bagaż do przyszłych projektów i możesz po prostu skopiować wystarczająco ogólną konfigurację, taką jak wymieniona powyżej. Prawdopodobnie jest bardziej ogólna lokalizacja konfiguracji, ale nie wiem od początku mojej głowy.źródło
Gorąco polecam ten film, aby w tej chwili wybrać odpowiednie narzędzie do debugowania naszego kodu.
https://www.youtube.com/watch?v=GwgF8GcynV0
Osobiście przedstawiłbym dwa duże tematy w tym filmie.
To moje dwa centy!
źródło
Wszystkie inne odpowiedzi dają już prawie wszystko ... Tylko mały dodatek.
Jeśli potrzebujesz więcej debuggera podobnego do IDE (nie-CLI) i nie boisz się używać Vima jako edytora, sugeruję wtyczkę Vim Ruby Debugger .
Jego dokumentacja jest dość prosta, więc kliknij link i zobacz. Krótko mówiąc, pozwala ustawić punkt przerwania w bieżącej linii w edytorze, przeglądać zmienne lokalne w sprytnym oknie podczas pauzy, przechodzić / przechodzić do - prawie wszystkie zwykłe funkcje debuggera.
Dla mnie używanie tego debuggera vim do debugowania aplikacji Railsów było całkiem przyjemne, chociaż bogate możliwości rejestratora Railsów prawie eliminują jego potrzebę.
źródło
Właśnie odkryłem ten klejnot (zmienia Pry w debugger dla MRI Ruby 2.0+)
https://github.com/deivid-rodriguez/pry-byebug
Zainstaluj za pomocą:
następnie użyj dokładnie tak
pry
, jak zaznacz linię, w której chcesz przerwać:W przeciwieństwie wanilia pry jednak ten klejnot ma kilka kluczowych GDB-jak nawigacja poleceń takich jak
next
,step
ibreak
:źródło
-w
flagę (ostrzeżenia)źródło
irb
to świetne miejsce na start. Spróbuj użyć irb z małymi wątpliwymi fragmentami. Uwielbiam ruby-debug (ruby-debug19 dla Ruby 1.9+), ponieważ ułatwia zatrzymanie uruchomionego programu, sprawdzenie zmiennych, przejście do irb, a następnie kontynuowanie działania.Aby łatwo debugować skrypt powłoki Ruby, po prostu zmień jego pierwszą linię z:
do:
Następnie za każdym razem, gdy zostanie wyświetlona konsola debugera, możesz wybrać:
c
dla Kontynuuj (do następnego wyjątku, punktu przerwania lub linii z:)debugger
,n
dla następnej linii,w
/where
do wyświetlania ramki / stosu wywołań,l
aby pokazać aktualny kod,cat
aby pokazać punkty zaczepienia.h
aby uzyskać dodatkową pomoc.Zobacz też: Debugowanie za pomocą ruby-debug , Skróty klawiszowe dla ruby-debug gem .
W przypadku, gdy skrypt po prostu się zawiesił i potrzebujesz śledzenia wstecznego, spróbuj użyć
lldb
/gdb
like:a następnie sprawdź pierwszy plan procesu.
Wymień
lldb
sięgdb
jeśli działa lepiej. Prefiks z,sudo
aby debugować proces nienależący do firmy.źródło
Od wersji 2.4.0 Rubiego łatwiej jest rozpocząć sesję IRB REPL w środku dowolnego programu Ruby. Umieść te wiersze w punkcie programu, który chcesz debugować:
Możesz uruchomić kod Ruby i wydrukować zmienne lokalne. Naciśnij Ctrl + D lub,
quit
aby zakończyć REPL i pozwolić programowi Ruby działać dalej.Możesz także użyć
puts
i,p
aby wydrukować wartości z programu w trakcie jego działania.źródło
Jeśli używasz RubyMine , debugowanie skryptów Ruby jest proste i nieskomplikowane.
Załóżmy, że masz skrypt Ruby hello_world.rb
1. Ustaw punkty przerwania
Ustaw punkt przerwania w linii 6, jak poniżej.
2. Rozpocznij debugowanie
Teraz możesz po prostu uruchomić debuger, aby uruchomić skrypt:
3. Sprawdź zmienne itp.
Następnie, gdy wykonanie osiągnie punkt przerwania, będziesz mógł sprawdzić zmienne itp.
Dalsze informacje w celach informacyjnych
źródło
debugowanie printf
Zawsze istniały kontrowersje wokół technik debugowania, niektórzy ludzie lubią debugować za pomocą instrukcji print, inni lubią kopać głęboko za pomocą debugera.
Sugerowałbym wypróbowanie obu podejść.
Właściwie jeden ze starych ludzi od Uniksa powiedział niedawno, że debugowanie printf było w niektórych przypadkach szybszym sposobem.
Ale jeśli jesteś nowy w jakiejś pracy i musisz zrozumieć dużą porcję kodu, to naprawdę przydatne jest przejście przez to, umieszczanie punktów przerwania tu i tam, i śledzenie, jak to działa.
Powinien dać ci trochę zrozumienia, jak tkany jest kod.
Jeśli jesteś nowy w oprogramowaniu innych ludzi, może ci to pomóc.
Szybko dowiesz się, czy sprytnie to ułożyli, czy to tylko kupa gówna.
źródło
Cóż, biblioteka Ruby standard ma łatwy w użyciu debugger konsoli podobny do gdb: http://ruby-doc.org/stdlib-2.1.0/libdoc/debug/rdoc/DEBUGGER__.html Nie ma potrzeby instalowania żadnych dodatkowych klejnotów. W ten sposób można również debugować skrypty Railsowe.
na przykład
źródło
Matką wszystkich debuggerów jest zwykły stary ekran wydruku. W większości przypadków prawdopodobnie chcesz sprawdzić tylko niektóre proste obiekty, szybki i łatwy sposób jest następujący:
Spowoduje to wydrukowanie zawartości @result na STDOUT z linią z przodu w celu łatwej identyfikacji.
Bonus, jeśli korzystasz z platformy obsługującej automatyczne ładowanie / ponowne ładowanie, takiej jak Rails, nie musisz nawet ponownie uruchamiać aplikacji. (O ile kod, który debugujesz, nie zostanie ponownie załadowany z powodu ustawień specyficznych dla platformy)
Uważam, że działa to dla mnie w 90% przypadków użycia. Możesz także użyć ruby-debug, ale uważam, że przez większość czasu jest to przesada.
źródło
Istnieje wiele debuggerów z różnymi funkcjami, na podstawie których dokonujesz wyboru. Moje priorytety były zadowalające z ruchami podważającymi, które były:
źródło