Возможно, Ruby on Rails — одна из лучших инноваций в современной веб-разработке. Его проницательная ориентация на простоту и продуктивность разработчиков в сочетании с удовлетворенностью пользователей привела к формированию культуры быстрого прототипирования с упором на модульное тестирование (даже если DHH с тех пор пересмотрел свою позицию ). Rails, без сомнения, стал катализатором для многих успешных стартапы (среди них твиттер). Одной из основных критических замечаний в отношении этого (особенно со стороны людей, которые менее опытны в его использовании) является интенсивное использование «магии». Как разработчики Ruby, мы прекрасно понимаем, что магия — это просто DSL и метапрограммирование, но это все равно может разочаровать отладку. Введите: Byebug.
Де-факто отладчиком для Rails является Byebug. Он работает с Rails, где такие вещи, как Pry, терпят неудачу, рекомендуется основной командой Rails и даже поставляется вместе с Rails. Эта статья познакомит вас с настройкой базовой отладки и некоторыми более продвинутыми методами.
Начало настройки
Версия 5.0 Rails поставляется с Byebug, но если у вас его нет, вы можете просто добавить следующее в ваш Gemfile и запустить bundle
gem "byebug""
Пример
Я взял на себя смелость запустить быстрый Rails-проект для отладки здесь . Это простое приложение, демонстрирующее сломанный алгоритм быстрой сортировки, и мы собираемся использовать Byebug для его исправления.
Quicksort выполняет O (n log n), используя подход «разделяй и властвуй» для сортировки массива (действительно, он настолько производительный, что Ruby использует его внутри для своего метода array.sort
Я мог бы весь день рассказывать о алгоритмах сортировки, но мой редактор будет кричать на меня, поэтому нам лучше вернуться к ByeBug:
Клонировать проект:
git clone https://github.com/disavowd/quicksorter.git
Запустите следующее:
cd quicksorter && rails s
Вот что вы должны увидеть, перейдя по адресу http: // localhost: 3000 :
Unsorted: [77, 22, 66, 28, 39, 4, 54]
Sorted: [4, 28, 85]
И вот довольно надуманный пример, который привел нас сюда:
def quicksort(array)
return array if array.length <= 1
pivot_index = (array.length / 2).to_i
pivot_value = array[pivot_index]
array.delete_at(pivot_index)
lesser = Array.new
greater = Array.new
array.each do |x|
if x <= pivot_value
lesser << x
else
greater << x
end
end
return quicksort(lesser) + [pivot_value] - quicksort(greater)
end
Основы
Вы можете ввести byebug аналогично другим отладчикам: выберите в коде точку, в которую нужно перейти в отладчик, и добавьте:
...code...
byebug
...code...
или:
...code...
debugger
...code...
Я уже сделал это для вас в отдельном контроллере, поэтому, если вы перейдете по адресу http: // localhost: 3000 / debug , вы получите прямой доступ к ByeBug в вашем терминале, который будет выглядеть примерно так:
28: def quicksort
29: @sorted = quicksort_algorithm(@unsorted)
30: end
31:
32: def debug
33: byebug
=> 34: @sorted = quicksort_algorithm (@unsorted)
35: сделать ‘быструю сортировку’
36: конец
37: конец
Не самый понятный интерфейс. Так что же нам теперь делать? Ну, вот команды byebug:
n
next
Он просто выполнит функцию, не проводя вас по коду.
Если вы хотите идти построчно, используйте:
s
Говоря об источнике:
l
Вы можете перейти к нему, чтобы увидеть код перед ним. Вы также можете передать начальную и конечную строки, разделив их знаком переноса: -
l 2-6
c
Ценно, когда вы имеете дело с вложенными хэшами или другими, немного более сложными структурами данных.
pp
Со всем этим контролем над выполнением легко забыть, что мы можем точно проверить, что находится в стеке:
q
Покажет вам, что self в настоящее время является объектом self.class
Какие у него методы?
ApplicationController
m ApplicationController
m
method
Это завершает основы. Давайте посмотрим на более практический пример, касающийся нашей проблемы.
Расширенное использование
Наша быстрая сортировка просто сортирует элементы — просто теряет половину из них где-то по пути. Разве не было бы здорово, если бы мы могли установить условную точку останова? Ой, подождите … Мы можем! Давайте начнем с Byebug, когда значение pivot равно среднему значению в массиве, который мы видим в браузере, и возьмемся за него.
Добавьте следующее в строку 25:
debug
quicksort
quicksort_algorithm
Теперь в консоли byebug введите:
byebug if pivot_value == 28
Тебе следует увидеть:
greater
Ну, эти, конечно, похожи на наши недостающие номера Виновник, очевидно, ошибочный [77, 66, 39, 54]
-
Как наглядно иллюстрирует этот надуманный пример, +
Изучение того, когда и какие условия ставить перед вашими контрольными точками, является огромным благом для продуктивного использования Byebug.
Другие продвинутые методы
byebug
Это также занимает целое число, так что вы можете видеть, что будет выполняться за пару кадров стека, например: f
f 2
th
list
start
Кроме того, вы можете передать число для переключения контекста в соответствующий поток.
stop
Это (полезно) сохраняется между сеансами отладки.
hist
save
.byebug_save
source
irb
bt
info
Передайте ему args
variables
instance_variables
global_variables
locals
file
Это абсолютно бесценно, если вы не уверены, что ваши изменения распространились.
Заканчивать
Это может быть хорошим учебником для отладки с помощью Byebug, но мы едва поцарапали поверхность. Мы не рассматривали точки останова и перехвата, проходящие через стек программ или их отображение. Для получения дополнительной информации, я рекомендую этот превосходный шпаргалку , или еще лучше, просто копаться и играть с ним. Это довольно интуитивно понятно после начальной кривой обучения, и вы должны найти это ценным дополнением к своему инструментарию разработчика.
Одна из замечательных особенностей Byebug в том, что он прекрасно работает в тандеме с другими программами. Превосходный pry-byebug добавляет команды « next
step
finish
continue
break
Кроме того, одним из моих драгоценных камней по умолчанию в любом проекте, в котором я использую minitest , является фантастический minitest-byebug . Это приведет вас прямо к сеансу Byebug в случае сбоя одного из ваших тестов. Немного поработав, вы можете сделать это с помощью Guard , чтобы создать грозный инструмент для юнит-тестирования. Наконец, для вас, Sublime пользователей, существует sublime_debugger , который упаковывает Byebug в аккуратный маленький графический интерфейс.
Удачной отладки!