Как отладить рубиновый код? - PullRequest
27 голосов
/ 08 ноября 2010

Я запускаю Ubuntu 10.10. Я просто хочу отладить простой скрипт. Потратив полдня, пытаясь понять, как это можно сделать, я сдаюсь. Какого черта я должен делать?

Я установил ruby-dev из репозитория Ubuntu
Я бегал sudo gem install ruby-debug и sudo gem install ruby-debug-ide

Я попробовал несколько разных способов сделать эту работу. Я попытался require 'ruby-debug', а затем установил debugger где-то в коде. Но Руби не найдет ruby-debug.
Я попытался настроить vim-ruby-debugger, что займет возраст для выполнения :Rdebugger myScript.rb и позволит мне устанавливать точки останова, но, похоже, нет способа выполнить мой код с использованием этого отладчика.
И я пытался использовать NetBeans, который просто падал каждый раз, когда я настраивал проект и нажимал что-либо.

Итак, уважаемое сообщество: Должен быть способ отладки Ruby. Не рельсы. Ничего фантастического. Просто какой-то скрипт CLI. Пожалуйста, помогите мне, или я потеряю то, что осталось от моего здравомыслия.

Edit: gem exec dir не было на моем пути. Так что, по крайней мере, теперь rdebug работает.

Ответы [ 9 ]

20 голосов
/ 08 ноября 2010

Ruby-debug для 1.8+, а ruby-debug19 для 1.9 +.

ruby-debug легок в освоении и очень полезен.Вы можете указать приложению запускаться до тех пор, пока не будет выполнено определенное условие, а затем прервать его, упрощая поиск значений nil или других условий, возникающих время от времени.

В командной строке используйте rdebug appname, и в итоге вы получите приглашение отладчика.Если вы хотите запустить строку 100 и остановиться, вы можете ввести c 100, и отладчик установит временную точку останова, программа запустится и остановится там, если она находится в пути выполнения.Как только он остановится, временная точка останова будет очищена.Если вы всегда хотите остановиться на строке 100, вы можете сделать b 100, затем c, и отладчик установит постоянную точку останова, продолжить, а затем остановиться, когда будет достигнута точка останова.Вы можете очистить точки останова, установить условные точки, возникающие при применении определенных условий, и т. Д. Вы можете набрать n, чтобы перейти к следующей инструкции, пропускающей вызовы подпрограмм, или s, чтобы перейти к ним.Существуют команды для отображения содержимого переменных различными способами, поэтому прочитайте документы.

Внутри rdebug вы можете заскочить в оболочку IRB с уже заполненными переменными, чтобы вы могли ткнуть в вещи, чтобы увидеть, что происходит.Изнутри вы можете проверять или устанавливать значения, помогая с настройками «что если».Если вы сделаете это из rdebug, вы можете продолжить программу с измененными значениями и посмотреть, как она себя ведет.

IRB имеет свое место, и он отлично подходит для попыток, но не заменяетотладчик, так же, как отладчик может делать некоторые вещи IRB, но не заменит его.Оба инструмента являются хорошей комбинацией и превосходно полагаются на операторы печати или дамп в файл журнала.


Pry стал отличной комбинацией IRB и отладчик , и его вполне стоит исследовать.

12 голосов
/ 26 июня 2012

pry лучше по сравнению с IRB. Ниже взяты из его README .

Pry - мощная альтернатива стандартной оболочке IRB для Ruby. Он написан с нуля, чтобы обеспечить ряд расширенных функций, в том числе:

  • Просмотр исходного кода (включая исходный код ядра C с гемом pry-doc)
  • Просмотр документации
  • Справочная система
  • Открытые методы в редакторах (edit-метод Class # method)
  • Подсветка синтаксиса
  • Интеграция командной оболочки (запускать редакторы, запускать git и rake изнутри Pry)
  • Суть интеграции
  • Навигация по штату (cd, ls и друзья)
  • Вызов среды выполнения (используйте Pry в качестве консоли разработчика или отладчика)
  • Поддержка экзотических объектов (экземпляры BasicObject, IClasses, ...)
  • Мощная и гибкая система команд
  • Возможность просмотра и воспроизведения истории

  • Множество удобных команд, основанных на IPython, Smalltalk и других расширенных REPL

  • Большое количество плагинов, которые обеспечивают удаленные сеансы, полную функциональность отладки и многое другое.

Прай также стремится быть не просто заменой IRB; это попытка перенести программирование на основе REPL на язык Ruby. В настоящее время он не такой мощный, как инструменты типа SLIME для lisp, но это общее направление, в котором движется Pry.

Pry также довольно гибок и позволяет существенно настроить пользователя, чтобы настроить его на чтение из любого объекта, имеющего метод readline, и запись в любой объект, имеющий метод put - многие другие аспекты Pry также настраиваются, делая его хороший выбор для реализации пользовательских оболочек.

6 голосов
/ 23 ноября 2012
  1. В рубине:

    ruby ​​-rdebug myscript.rb затем,

    • b: поставить точку останова
    • и n (доб) или s (теп) и с (продолжение)
    • р (ед) для отображения
  2. В Rails: Запустите сервер с

    • скрипт / сервер --debugger

      и добавьте отладчик в код.

4 голосов
/ 08 ноября 2010

Лучший отладчик, который я когда-либо использовал для Ruby, это встроенный в Netbeans . Вам нужно установить гем быстрого отладчика ruby ​​от Netbeans (я не уверен, что это за камень на самом деле, но Netbeans предложит вам сделать это). Я считаю, что это работает намного лучше, если вы переключите Netbeans со встроенного JRuby 1.4 на установку Ruby по умолчанию в вашей системе. Также стоит обратить внимание на гем breakpoint, и полезно использовать встроенную библиотеку Ruby logger с самого начала вашей разработки. Удачи!

2 голосов
/ 08 ноября 2010

Использовать IRB. Это интерактивная оболочка Ruby. При возникновении ошибок он выдает трассировку с номерами строк, чтобы вы могли определить, какая часть вашего кода пошла не так. Вы можете load свои исходные файлы и запускать отдельные методы, чтобы увидеть, работают ли они правильно. IRB обеспечивает полезный вывод - когда вы вводите некоторый код, он вычисляет выражение и затем печатает возвращаемое значение, используя .inspect.

1 голос
/ 05 августа 2015

Попробуйте использовать Ruby Debugger по умолчанию:

ruby -r debug filename[, ...] 

Или, если это скрипт CLI, просто измените его первую строку с:

#!/usr/bin/env ruby

до:

#!/usr/bin/env ruby -rdebug

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

Или проверьте следующий пример скрипта:

#!/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. Ниже приведен простой пример печати сценария возврата на передний план:

echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby)

Заменить lldb на gdb, если работает лучше. Префикс sudo для отладки не принадлежащего процессу.

1 голос
/ 11 декабря 2014

Вы можете увидеть шпаргалку, бегущую

  gem install cheat
  cheat rdebug

Это покажет полезные команды для использования rdebug.

0 голосов
/ 01 мая 2018

Существует множество консольных отладчиков для ruby ​​с различными функциями, на основе которых вы сделаете выбор.

Если вам нужно, - это интуитивно понятная навигация (например, следующие шаги построчно,шаг в блоки) и быстрая понятная документация - это работает для меня лучше всего:

https://github.com/garmoshka-mo/pry-moves


Другая интересная функция, которая мне потребовалась - это отладка внутри отладчика,Например, если я остановился в действии Контроллера:

def index
    list = Orders.for_user(current_user) 
=>  binding.pry
end

Теперь я хочу понять, почему list пусто?- Я могу запустить debug Orders.for_user(current_user) и посмотреть, что там происходит

0 голосов
/ 16 марта 2017

Отладка Ruby имеет сложную историю, изобилующую инструментами, которые поддерживают только определенную минорную версию MRI.К счастью, для 2.0 и более поздних версий вы можете использовать byebug .

Использование командной строки просто: запустите byebug <your script>.Вы также можете отредактировать файл и сбросить вызов функции byebug там, где вы хотите запустить отладку.

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