Как отлаживать рубиновый код?
Я запускаю Ubuntu 10.10. Я просто хочу отладить простой script. Проведя полдня, пытаясь понять, как это можно сделать, я сдаюсь. Какого черта я должен был сделать?
Я установил ruby-dev
из репозитория Ubuntu
Я запустил sudo gem install ruby-debug
и sudo gem install ruby-debug-ide
Я пробовал несколько разных способов сделать эту работу. Я попробовал require 'ruby-debug'
, а затем установил debugger
где-то в коде. Но Ruby не найдет ruby-debug
.
Я попытался настроить vim-ruby-debugger
, для выполнения :Rdebugger myScript.rb
потребуется возраст, и позволит мне установить точки останова, но, похоже, не существует способа выполнить мой код с помощью этого отладчика.
И я попытался использовать NetBeans, который просто разбивался каждый раз, когда я настраивал проект и щелкал что угодно.
Итак, уважаемое сообщество: Должен быть способ отладки Ruby. Не рельсы. Ничего особенного. Просто CLI script. Пожалуйста, помогите мне или я потеряю то, что осталось от моего здравомыслия.
Edit:
gem exec dir не был на моем пути. Итак, по крайней мере rdebug, похоже, теперь работает.
Ответы
Ответ 1
Ruby-debug для 1.8+, а ruby-debug19 - для 1.9 +.
ruby-debug прост в освоении и очень полезен. Вы можете сказать, что приложение запускается до тех пор, пока не будет определено какое-либо условие, затем переломите его, чтобы было легко найти нулевые значения или другие условия, возникающие спорадически.
В командной строке используйте rdebug appname
, и вы попадете в приглашение отладчика. Если вы хотите перейти к строке 100 и остановить, вы можете ввести c 100
, и отладчик установит временную точку прерывания, программа запустится и остановится там, если она находится в пути выполнения. Как только он остановится, временная точка останова будет очищена. Если вы всегда хотите остановиться в строке 100, вы можете сделать b 100
, затем c
, и отладчик установит постоянную точку останова, продолжит, а затем остановится, когда достигнет точки останова. Вы можете очистить точки останова, установить условные, которые возникают, когда применяются определенные условия, и т.д. Вы можете ввести n
, чтобы перейти к следующей инструкции, пропуская вызовы подпрограмм или s
, чтобы войти в них. Существуют команды для отображения содержимого переменных по-разному, поэтому читайте документы.
Изнутри rdebug вы можете попасть в оболочку IRB с уже заполненными вами переменными, чтобы вы могли сунуть вещи, чтобы узнать, что происходит. Изнутри вы можете проверить или установить значения, помогая с настройками "что-если". Если вы сделаете это изнутри rdebug, вы можете продолжить программу с измененными значениями и посмотреть, как она себя ведет.
IRB имеет свое место, и он отлично подходит для пробных вещей, но это не замена отладчика, так же как отладчик может делать некоторые вещи IRB-ish, но не заменит его. Оба инструмента являются хорошей комбинацией и избивают из-за того, что они полагаются на заявления печати или сбрасываются в файл журнала.
Pry стал отличной комбинацией IRB и отладчик, и стоит изучить.
Ответ 2
pry лучше по сравнению с IRB. Ниже перечислены его README.
Pry - мощная альтернатива стандартной оболочке IRB для Ruby. Он написан с нуля, чтобы предоставить ряд дополнительных функций, в том числе:
- Просмотр исходного кода (включая источник ядра C с драгоценным камнем pry-doc)
- Просмотр документации
- Система Live Help
- Откройте методы в редакторах (метод класса-метода редактирования-метода)
- Подсветка синтаксиса
- Интеграция командной оболочки (запуск редакторов, запуск git и грабли из Pry)
- Интеграция Gist
- Навигация вокруг состояния (cd, ls и friends)
- Вызов времени выполнения (используйте Pry в качестве консоли разработчика или отладчика)
- Поддержка экзотических объектов (экземпляры BasicObject, классные классы,...)
- Мощная и гибкая система команд
-
Возможность просмотра и воспроизведения истории
-
Многие удобные команды, вдохновленные IPython, Smalltalk и другими расширенными REPL
-
Широкое количество плагинов, которые предоставляют удаленные сеансы, полную функциональность отладки и т.д.
Pry также стремится быть более чем заменой IRB; это попытка внедрить программирование на языке REPL на язык Ruby. В настоящее время это не так сильно, как инструменты, такие как SLIME для lisp, но это общее направление Pry.
Pry также довольно гибкий и позволяет значительно настраивать пользовательскую настройку, чтобы настроить его на чтение с любого объекта, который имеет метод readline, и записывать на любой объект, который имеет метод puts - многие другие аспекты Pry также настраиваются, что делает его хороший выбор для реализации пользовательских оболочек.
Ответ 3
Ответ 4
Лучший отладчик, который я когда-либо использовал для Ruby, был встроен в Netbeans. Вам необходимо установить быструю рубиновую отладчику из Netbeans (я не уверен, какой камень это на самом деле, но Netbeans предлагает вам сделать это). Я считаю, что он работает намного лучше, если вы отключите Netbeans от встроенного JRuby 1.4 до вашей стандартной установки Ruby по умолчанию. Кроме того, полезен и драгоценный камень breakpoint
, который стоит взглянуть и использовать встроенную библиотеку Ruby logger
с самого начала вашей разработки. Удачи!
Ответ 5
Используйте IRB. Это интерактивная оболочка Ruby. Когда возникают ошибки, он дает трассировку с номерами строк, чтобы вы могли определить, какая часть вашего кода пошла не так. Вы можете load
ваши исходные файлы и запускать отдельные методы, чтобы убедиться, что они работают правильно. IRB предоставляет полезный результат - при вводе некоторого кода он будет оценивать выражение, а затем печатать возвращаемое значение с помощью .inspect
.
Ответ 6
Вы можете видеть, что обложка Cheat работает
gem install cheat
cheat rdebug
Это покажет полезные команды для использования rdebug.
Ответ 7
Попробуйте использовать Ruby Debugger по умолчанию:
ruby -r debug filename[, ...]
Или, если это CLI script, просто измените его первую строку:
#!/usr/bin/env ruby
в
#!/usr/bin/env ruby -rdebug
и script остановится на каждом Исключении.
Или проверьте следующий пример script:
#!/usr/bin/env ruby
class Hello
def initialize( hello )
@hello = hello
end
def hello
@hello
end
end
salute = Hello.new( "Hello, Mac!" )
puts salute.hello
Вы можете отлаживать его, как показано ниже:
# ruby -r debug hello.rb
Debug.rb
Emacs support available.
hello.rb:3:class Hello
(rdb:1) v l
salute => nil
(rdb:1) b 10
Set breakpoint 1 at hello.rb:10
(rdb:1) c
Hello, Mac!
Источник: Ruby Debugger
В качестве альтернативы используйте lldb
/gdb
. Ниже приведен простой пример для печати script backtrace на передний план:
echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby)
Замените lldb
на gdb
, если он работает лучше. Префикс с sudo
для отладки не принадлежащего ему процесса.
Ответ 8
Отладка Ruby имеет сложную историю, заваленную инструментами, которые поддерживают только небольшую версию MRI. К счастью, для 2.0 и далее вы можете использовать byebug.
Использование командной строки прост: запустите byebug <your script>
. Вы также можете отредактировать свой файл и отбросить вызов функции byebug
там, где вы хотите начать отладку.