Лучший способ отладки сторонних гемов в ruby - PullRequest
34 голосов
/ 17 декабря 2011

Поскольку внутри рубинового камня может быть много Призрачных методов , я не думаю, что будет хорошей идеей изучить внутренний механизм рубинового камня, просто статически читая его исходный код. Есть ли способ присоединить исходный файл из третьей части к запущенному процессу ruby ​​для отладки, чтобы я мог установить точку останова и посмотреть, как все работает динамически?
Кстати, я попытался перейти к исходному файлу гема третьей части в RubyMine, щелкнув контекстное меню «Перейти к-> Реализации» оператора «require» или другой символ гема третьей части (require 'watir' например), но безуспешно. Нормально ли для IDE языка динамической типизации, например Ruby, отказывать в навигации по символам?

Ответы [ 5 ]

41 голосов
/ 17 декабря 2011

Я хотел бы знать, есть ли лучший способ сделать это, но как я обычно делаю это:

  1. Добавьте гем ruby-debug в свой Gemfile (или ruby-debug19, если вы используете Ruby 1.9.2)
  2. Найдите самоцвет, выполнив bundle show gemname. Я использую Mac, поэтому обычно передаю это в pbcopy, чтобы он копировался в буфер обмена. bundle show rails | pbcopy
  3. Откройте каталог gem в вашем любимом редакторе. mvim /path/to/gem/directory
  4. Перейдите к файлу и строке, где вы хотите поместить точку останова * и вставьте debugger над рассматриваемой строкой.
  5. Перезагрузите страницу, запустите тестирование или сделайте все возможное, чтобы заставить файл Gem выполняться
  6. Когда выполнение останавливается в отладчике, вы можете просматривать переменные (p variable_name) и построчно перемещаться с помощью команд ruby ​​отладчика .

* Знание места установки точки останова может потребовать некоторого понимания кода, но вы должны начать с lib / gemname.rb

12 голосов
/ 26 декабря 2012

Я бы не стал редактировать файлы Gem, как это предлагается в принятом в настоящее время ответе. Вместо этого поместите команду debugger в один из файлов приложения и используйте команду break, чтобы установить точку останова в геме. Я использую rvm с gemset, вот как я это делаю:

break /Users/chris/.rvm/gems/ruby-1.9.3-p125@<gemset>/gems/<gem_name>-<gem-version>/<path_to_file>:<line_number>

1 голос
/ 26 декабря 2018

Обе команды выводят путь к источнику драгоценного камня на вашем компьютере.

# if it is present in your gemfile
bundle show gemname

# if not in your gemfile
gem which gemname

Затем просто откройте папку в выбранном вами текстовом редакторе и удачной отладки!

0 голосов
/ 30 января 2019

pry драгоценный камень работает для меня.

bundle add pry --group "development, test"

И вам потребуется pry в .rb файлах, где вы используете binding.pry

require 'pry'

Вот ссылка GitHub

0 голосов
/ 17 декабря 2011

В языках, которые изменяют код во время выполнения, таких как Ruby, трудно точно предсказать 100% происхождение символов, методов и т. Д.

Я имею дело со многими сторонними гемами, которые нуждаются в анализе исходного кода, и обнаружил, что лучший инструмент для этой задачи - это Netbeas + это плагины Ruby и Rails.

  • обеспечивает хорошую навигацию в исходном коде зависимых гемов (в отличие от других альтернатив)
  • визуальные точки останова и отладки, которые действительно работают (с трассировкой и всем) **

** у него есть некоторые глюки с вызовами методов в полученных кодовых блоках (как каждый {}), но я научился справляться с этими

Обычно я устанавливаю точки останова и анализирую код во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...