2011-12-17 16 views
30

Ponieważ może być dużo Ghost Methods wewnątrz rubinowego klejnotu, nie sądzę, że dobrze jest studiować wewnętrzny mechanizm rubinowego klejnotu właśnie przez czytanie statycznego kodu źródłowego. Czy istnieje sposób na dołączenie pliku źródłowego klejnotu trzeciej części do działającego procesu ruby ​​w celu debugowania, aby można było ustawić punkt przełomowy i zobaczyć, jak rzeczy działają dynamicznie?
BTW, próbowałem przejść do pliku źródłowego klejnotu trzeciej części w RubyMine, klikając menu kontekstowe "Przejdź do-> Wdrożenia" instrukcji "wymagaj" lub innego symbolu klejnotu z trzeciej części (require 'watir' na przykład), bez powodzenia. Czy to normalne, że IDE dynamicznego języka pisania, takiego jak Ruby, nie może nawigować symbolami?Najlepszy sposób na debugowanie klejnotów stron trzecich w rubinach

Odpowiedz

37

chciałbym wiedzieć, czy istnieje lepszy sposób to zrobić, ale jak zwykle zrobić to:

  1. Dodaj gem ruby-debug do Gemfile (lub ruby-debug19 jeśli jesteś na Ruby 1.9.2)
  2. Znajdź klejnot wykonując bundle show gemname. Jestem na komputerze Mac, więc zwykle przesyłam ten plik do pbcopy, aby został skopiowany do schowka. bundle show rails | pbcopy
  3. Otwórz katalog klejnotów w ulubionym edytorze. mvim /path/to/gem/directory
  4. Przejdź do pliku i linii, w której chcesz umieścić punkt przerwania * i wstaw debugger powyżej linii.
  5. Odśwież stronę, uruchom testy, czy cokolwiek by pobrać plik Gem wykonać
  6. Kiedy wykonanie zatrzymuje się debuggera, można kontrolować zmienne (p variable_name), a linia ruch po linii z ruby debugger commands.

* Wiedząc, gdzie umieścić punkt przerwania może podjąć pewne zrozumienie kodu, ale należy rozpocząć w lib/gemname.rb

+3

Dzięki. Działa to świetnie. FWIW, użyłem tych instrukcji z [Pry] (https: // rubygems.org/gems/pry) zamiast ruby-debug i to działało również. –

+1

Czy to przeszkadzałoby innym aplikacjom na tym samym komputerze, jeśli używają tego samego Klejnotu? – flyingL123

+0

@ flyingL123, Przypuszczam, że spowoduje to przerwanie innych, jeśli będą działać w trybie debugowania jako aplikacja. – parzival

0

W językach, które zmieniają się w czasie wykonywania kodu, takich jak Ruby, trudno jest dokładnie przewidzieć w 100% pochodzenie symboli, metod itp

mam do czynienia z dużą ilością kamieni szlachetnych osób trzecich, które wymagają analizy kodu źródłowego i Odkryłem, że najlepszym narzędziem do tego zadania jest Netbeas + to wtyczki Ruby i Rails.

  • umożliwia dobrą nawigację w kodzie źródłowym perełki zależne (w przeciwieństwie do innych alternatyw)
  • breakpoints wizualnych i debugowania, które faktycznie działa (z cienia i wszystko) **

** ma jakieś usterki z wywołaniami metod w wygenerowanych blokach kodu (jak każdy {}), ale nauczyłem się radzić sobie z tymi

Co zwykle robię jest ustawianie punktów przerwania i analizowanie kodu w czasie wykonywania.

9

chciałbym uniknąć edycji plików Gem jak zasugerowano w aktualnie akceptowanych odpowiedź. Zamiast tego umieść komendę debugger w jednym z plików aplikacji i użyj polecenia break, aby ustawić punkt przerwania w klejnocie. Używam rvm z gemset tak oto jak to zrobić:

break /Users/chris/.rvm/gems/[email protected]<gemset>/gems/<gem_name>-<gem-version>/<path_to_file>:<line_number>

+0

Czy zaakceptowana odpowiedź przeszkadzałaby innym aplikacjom na tym samym komputerze, jeśli używają tego samego Klejnotu? Jeśli tak, wydaje się, że to rozwiązanie pozwoli uniknąć tego problemu. – flyingL123

+2

Tak. O to chodzi. Jeśli nie masz opcji, unikałbym edycji plików Gem za wszelką cenę, chyba że chcesz je rozwidlić –

Powiązane problemy