Статьи

Преимущества и недостатки отладки Ruby с помощью Byebug

Возможно, 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 thliststart Кроме того, вы можете передать число для переключения контекста в соответствующий поток.

stop Это (полезно) сохраняется между сеансами отладки.

histsave

.byebug_save

sourceirb

bt

info Передайте ему argsvariablesinstance_variablesglobal_variableslocals file Это абсолютно бесценно, если вы не уверены, что ваши изменения распространились.

Заканчивать

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

Одна из замечательных особенностей Byebug в том, что он прекрасно работает в тандеме с другими программами. Превосходный pry-byebug добавляет команды « nextstepfinishcontinuebreak Кроме того, одним из моих драгоценных камней по умолчанию в любом проекте, в котором я использую minitest , является фантастический minitest-byebug . Это приведет вас прямо к сеансу Byebug в случае сбоя одного из ваших тестов. Немного поработав, вы можете сделать это с помощью Guard , чтобы создать грозный инструмент для юнит-тестирования. Наконец, для вас, Sublime пользователей, существует sublime_debugger , который упаковывает Byebug в аккуратный маленький графический интерфейс.

Удачной отладки!