Как отлаживать скрипты Ruby?
Я скопировал следующий код Ruby из Интернета и внес несколько изменений.
Но это не работает!
Пожалуйста помоги. Что я могу сделать, чтобы отладить программу самостоятельно?
Ответы
Ответ 1
Используйте Pry (GitHub).
Установить через:
$ gem install pry
$ pry
Затем добавьте:
require 'pry'; binding.pry
в вашу программу.
По pry
0.12.2 однако, нет никаких команд навигации, таких как next
, break
и т.д. Некоторые другие драгоценные камни, кроме того, обеспечить это, смотри, например, pry-byedebug
.
Ответ 2
Ответ 3
Как рекомендуют перила: используйте pry!
Я могу только согласиться на это.
pry намного лучше, чем irb.
Вам нужно добавить
require 'pry'
в исходный файл
а затем вставьте контрольную точку в исходный код, добавив
binding.pry
в том месте, где вы хотите взглянуть на вещи
(это похоже на запуск точки останова в классической среде IDE)
Как только ваша программа попадает в
binding.pry
вы будете брошены прямо в ремень,
со всем контекстом вашей программы под рукой,
так что вы можете просто исследовать все вокруг, исследовать все объекты,
изменить состояние и даже изменить код на лету.
Я считаю, что вы не можете изменить код метода, который вы сейчас используете,
поэтому вы можете с грустью не изменять следующую строку, которая будет выполнена.
Но хороший код рубина в любом случае имеет тенденцию быть одной строкой; -)
Ответ 4
Отладка путем создания исключений гораздо проще, чем косоглазиться с помощью операторов журналов print
, а для большинства ошибок - намного быстрее, чем открытие отладчика irb, например pry
или byebug
. Эти инструменты не должны быть вашим первым шагом.
Быстрая отладка Ruby/Rails:
1. Быстрый метод: Поднимите Exception
, а затем .inspect
его результат
Самый быстрый способ отладки кода Ruby (особенно Rails) - это raise
исключение вдоль пути выполнения вашего кода при вызове .inspect
метода или объекта (например, foo
):
raise foo.inspect
В приведенном выше коде raise
запускает Exception
, который останавливает выполнение вашего кода, и возвращает сообщение об ошибке, которое удобно содержит .inspect
информацию об объекте/методе (т.е. foo
) в строке, которая вы пытаетесь отлаживать.
Этот метод полезен для быстрого изучения объекта или метода (например, это nil
?) и для немедленного подтверждения того, что строка кода даже вообще выполняется в рамках данного контекста.
2. Fallback: используйте отладчик ruby IRB, например byebug
или pry
Только после того, как у вас есть информация о состоянии потока выполнения ваших кодов, вы должны рассмотреть возможность перехода к отладчику IRB от рубинового драгоценного камня, например pry
или byebug
, где вы можете глубже погрузиться в состояние объектов в пути выполнения.
Общий совет для начинающих
Когда вы пытаетесь отладить проблему, всегда рекомендуется всегда: Прочитать сообщение об ошибке @@$$ (RTFM)
Это означает, что вы внимательно и полностью читаете сообщения об ошибках перед тем, как действовать, чтобы вы поняли, что он пытается сказать вам. Когда вы отлаживаете ошибку, задайте следующие психические вопросы в этом порядке при чтении сообщения об ошибке:
- Что класс содержит ссылку на ошибку? (т.е. у меня есть правильный класс объекта или мой объект
nil
?)
- Какой метод содержит ссылку на ошибку? (т.е. является их типом в методе, можно ли вызвать этот метод для этого типа/класса объекта?)
- Наконец, используя то, что я могу сделать из моих последних двух вопросов, какие строки кода следует исследовать? (помните: последняя строка кода в трассировке стека не обязательно там, где проблема лежит.)
В трассировке стека обратите особое внимание на строки кода, которые поступают из вашего проекта (например, строки, начинающиеся с app/...
, если вы используете Rails). В 99% случаев проблема связана с вашим собственным кодом.
Чтобы проиллюстрировать, почему интерпретация в этом порядке важна...
например. сообщение об ошибке Ruby, которое смущает многих новичков:
Вы выполняете код, который в какой-то момент выполняется как таковой:
@foo = Foo.new
...
@foo.bar
и вы получите сообщение об ошибке:
undefined method "bar" for Nil:nilClass
Начинающие видят эту ошибку и думают, что проблема заключается в том, что метод bar
равен undefined. Это не так. В этой ошибке важна действительная часть:
for Nil:nilClass
for Nil:nilClass
означает, что @foo
равен Nil! @foo
не является переменной экземпляра foo
! У вас есть объект nil
. Когда вы видите эту ошибку, она просто рубится, пытаясь сказать вам, что метод bar
не существует для объектов класса nil
. (ну, так как мы пытаемся использовать метод для объекта класса foo
not nil
).
К сожалению, из-за того, как написана эта ошибка (undefined method "bar" for Nil:nilClass
), ее легко обмануть, думая, что эта ошибка связана с bar
undefined
. Когда вы не читаете внимательно, эта ошибка заставляет новичков ошибочно переходить к деталям метода bar
на foo
, полностью упуская часть ошибки, которая указывает, что объект имеет неправильный класс (в данном случае: nil), Это ошибка, которую легко избежать, читая сообщения об ошибках целиком.
Резюме:
Всегда тщательно читать все сообщение об ошибке перед началом любой отладки. Это означает: всегда проверяйте тип объекта class в сообщении об ошибке сначала, а затем методы, прежде чем вы начнете следить за любым стеклом или строкой кода, где, по вашему мнению, может произойти ошибка. Эти 5 секунд могут сэкономить вам 5 часов разочарования.
tl; dr: Не жгите в журналах печати: вместо этого создавайте исключения. Избегайте кроличьих отверстий, тщательно читая ошибки перед отладкой.
Ответ 5
-
Распечатайте переменные, когда это возможно. (Это называется отладки printf). Вы можете сделать это, запустив
STDERR.puts x.inspect
или
STDERR.puts "Variable x is #{x.inspect}"
Если вы хотите сделать это проще для ввода, вы можете использовать exemplor gem.
-
Включите предупреждения. Если вы используете ruby
, запустите его с помощью переключателя -w
(например, ruby -w script.rb
). Если вы используете его из irb, и используете версию ruby до 1.9.2, введите $VERBOSE = true
в начале сеанса. Если вы пропустили переменную экземпляра, после того, как будут предупреждения, вы получите
предупреждение: переменная экземпляра @valeus
не инициализирована
-
Понимать концепцию бинарной отбивной (следующая цитата из Практики гибкого разработчика)
Разделите проблемное пространство пополам и посмотрите, какая половина содержит проблему. Затем разделите эту половину пополам и повторите.
-
Если вам удалась бинарная отбивная, вы можете обнаружить, что есть одна строка, которая не делает то, что вы ожидаете от нее. Например
[1, 2, 3].include?([1,2])
дает значение false
, даже если вы думаете, что он вернет true
. В этом случае вы можете посмотреть документацию. Веб-сайты для документации включают ruby-doc.org или APIdock. В последнем случае вы должны ввести include?
рядом с увеличительным стеклом рядом с верхним правом углом, выберите include?
, у которого Array
под ним (если вы не знаете, какой класс [1, 2, 3]
, введите [1, 2, 3].class
в irb), и вы попадаете в include? (Массив), в котором описывается, что он делает.
Однако, если документация не помогает, вы, скорее всего, получите хороший ответ, если можете задать вопрос о том, как определенная строка не делает то, что должна, а не почему весь script не делает то, что должно.
Ответ 6
удаляет все вещи
Добро пожаловать в 2017 ^ _ ^
Хорошо, поэтому, если вы не против тестирования новой среды IDE, вы можете сделать следующее бесплатно.
Быстрые инструкции
- Установить vscode
- Установите Ruby Dev Kit, если вы еще не
- Установите Ruby, ruby-linter и ruby-rubocop расширения для vscode
- Вручную установить любые драгоценные камни rubyide/vscode-ruby указывает, если необходимо
- Настройте
launch.json
для использования полей "cwd"
и и "program"
с помощью макроса {workspaceRoot}
- Добавьте поле под названием
"showDebuggerOutput"
и установите его на true
- Включить точки останова везде в ваших настройках отладки как
"debug.allowBreakpointsEverywhere": true
Подробные инструкции
- Загрузите Код Visual Studio aka
vscode
; это не то же самое, что Visual Studio. Он свободный, легкий и, как правило, положительно расценивается.
- Установите пакет Ruby Dev Kit; вы должны следовать инструкциям в своем репо здесь: https://github.com/oneclick/rubyinstaller/wiki/Development-Kit
- Затем вы можете либо устанавливать расширения через веб-браузер, либо внутри IDE; это для внутри IDE. Если вы выберете другую, вы можете пойти здесь. Перейдите в раздел Расширения vscode; вы можете сделать это несколькими способами, но наиболее вероятный метод будет, вероятно, ударить F1 и напечатать e x t до тех пор, пока параметр Расширения: установка расширений становится доступным. Альтернативы Ctrl Shift x и в верхней строке меню
View->Extensions
- Далее вам понадобятся следующие расширения; они не на 100% необходимы, но я позволю вам решить, что нужно делать после того, как вы переделали некоторые из них:
- рубин; автор расширений Пэн Lv
- рубинового rubocop; автор расширений misogi
- рубинового линт; автор расширений Cody Hoover
- Внутри рубинового каталога script мы создадим каталог через командную строку под названием
.vscode
, а там будет файл с именем launch.json
, где мы собираемся хранить некоторые параметры конфигурации,
{
"version": "0.2.0",
"configurations":
[
{
"name": "Debug Local File",
"type":"Ruby",
"request": "launch",
"cwd": "${workspaceRoot}",
"program": "{workspaceRoot}/../script_name.rb",
"args": [],
"showDebuggerOutput": true
}
]
}
- Следуйте инструкциям авторов расширений для ручной установки драгоценных камней. Сейчас он находится здесь: https://github.com/rubyide/vscode-ruby#install-ruby-dependencies
- Вероятно, вам захочется разместить точки останова везде, где вам нравится; включение этой опции не может привести к путанице. Для этого перейдите в верхнюю строку меню и выберите
File->Preferences->Settings
(или Ctrl ,) и прокрутите страницу до тех пор, пока вы не достигнете раздела Debug
. Разверните его и найдите поле под названием "debug.allowBreakpointsEverywhere"
- выберите это поле и щелкните значок маленького карандаша и установите его на true
.
После выполнения всего этого забавного материала вы сможете установить точки останова и отладки в меню, подобное этому в середине 2017 года, и более темную тему: < img src= "https://i.stack.imgur.com/1zCb2.jpg" alt= "введите описание изображения здесь" > со всеми интересными вещами, такими как стек вызовов, просмотр переменных и т.д.
Самый большой PITA: 1) установка предварительных требований и 2) сохранение конфигурации файла .vscode\launch.json
. Только №2 должен добавить какой-либо багаж в будущие проекты, и вы можете просто скопировать достаточно общую конфигурацию, такую как указанная выше. Там, вероятно, более общее расположение конфигурации, но я не знаю, с моей точки зрения.
Ответ 7
Все остальные ответы уже дают почти все... Просто небольшое дополнение.
Если вам нужен еще один IDE-подобный отладчик (не CLI) и не бойтесь использовать Vim в качестве редактора, я предлагаю Vim Ruby Debugger плагин для него.
Его документация довольно проста, поэтому следуйте по ссылке и смотрите. Короче говоря, это позволяет вам установить точку останова в текущей строке в редакторе, просматривать локальные переменные в отличном окне на паузе, переходить в/в - почти все обычные функции отладчика.
Для меня было довольно приятно использовать этот отладчик vim для отладки приложения Rails, хотя богатые возможности логгера Rails почти устраняют необходимость он.
Ответ 8
Я только что обнаружил этот драгоценный камень (превращает Прай в отладчик для MRI Ruby 2. 0+)
https://github.com/deivid-rodriguez/pry-byebug
Установить с помощью:
gem install pry-byebug
затем используйте точно так же, как pry
, отметьте строку, на которой вы хотите разбить:
require 'pry'; binding.pry
Однако, в отличие от vanilla pry, в этом геме есть несколько ключевых GDB-подобных команд, таких как next
, step
и break
:
break SomeClass#run # Break at the start of 'SomeClass#run'.
break Foo#bar if baz? # Break at 'Foo#bar' only if 'baz?'.
break app/models/user.rb:15 # Break at line 15 in user.rb.
break 14 # Break at line 14 in the current file.
Ответ 9
- Вы можете распечатать свои переменные по пути
- Включите флаг
-w
(предупреждения)
- Используйте такой инструмент, как ruby-debug
Ответ 10
Я настоятельно рекомендую это видео, чтобы в настоящий момент выбрать подходящий инструмент для отладки нашего кода.
https://www.youtube.com/watch?v=GwgF8GcynV0
Лично я выделил две большие темы в этом видео.
- Pry является отличным для отладочных данных, "pry - это проводник данных" (sic)
- Отладчик лучше отлаживать шаг за шагом.
Что мои два цента!
Ответ 11
Чтобы легко отладить оболочку Ruby script, просто измените ее первую строку:
#!/usr/bin/env ruby
в
#!/usr/bin/env ruby -rdebug
Затем каждый раз, когда отображается консоль отладчика, вы можете выбрать:
-
c
для продолжения (к следующему исключению, точке останова или строке с помощью: debugger
),
-
n
для следующей строки,
-
w
/where
для отображения стека кадров/вызовов,
-
l
Показать текущий код,
-
cat
, чтобы показать точки catchpoint.
-
h
для получения дополнительной справки.
Смотрите также: Отладка с ruby-debug, Ключевые ярлыки для рубинового отладочного камня.
Если script просто висит, и вам нужна обратная трассировка, попробуйте использовать lldb
/gdb
как:
echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby)
а затем проверьте процесс переднего плана.
Замените lldb
на gdb
, если он работает лучше. Префикс sudo
для отладки не принадлежащего ему процесса.
Ответ 12
Начиная с Ruby 2.4.0, легче запустить сеанс IRB REPL в середине любой программы Ruby. Поместите эти строки в точку программы, которую вы хотите отлаживать:
require 'irb'
binding.irb
Вы можете запустить Ruby-код и распечатать локальные переменные. Введите Ctrl + D или quit
, чтобы закончить REPL, и пусть программа Ruby будет работать.
Вы также можете использовать puts
и p
для печати значений из вашей программы по мере ее запуска.
Ответ 13
Если вы используете RubyMine, отладка рубиновых скриптов проста и понятна.
Предположим, что у вас есть Ruby script hello_world.rb
1. Установить точки останова
Установите точку останова в строке 6, как показано ниже.
![введите описание изображения здесь]()
2. Начать отладку
Теперь вы можете просто запустить отладчик для запуска script:
![введите описание изображения здесь]()
![введите описание изображения здесь]()
3. Осмотреть переменные и т.д.
Затем, когда выполнение попадает в точку останова, вы сможете проверять переменные и т.д.
![введите описание изображения здесь]()
Дополнительная информация для справки
Ответ 14
отладка printf
Всегда были споры вокруг методов отладки,
некоторым людям нравится отлаживать заявления печати,
некоторые другие любят рыть глубоко отладчиком.
Я предлагаю вам попробовать оба подхода.
На самом деле один из старых мужчин Unix недавно сказал:
что отладка printf была более быстрым способом для него в некоторых случаях.
Но если вы новичок в какой-то работе и должны понимать большой код кода,
то это действительно полезно, чтобы шаг на всем протяжении,
помещая некоторые точки останова здесь и там,
вместе с тем, как это работает.
Он должен дать вам некоторое представление о том, как скомпилирован код.
Если вы новичок в программном обеспечении других народов,
Это может помочь вам пройти через него.
Вы быстро узнаете, устроили ли они это умным способом,
или если это просто куча дерьма.
Ответ 15
Ну, Ruby standard lib имеет простой в использовании gdb-консольный отладчик:
http://ruby-doc.org/stdlib-2.1.0/libdoc/debug/rdoc/DEBUGGER__.html
Нет необходимости устанавливать какие-либо дополнительные драгоценные камни. Сценарии Rails тоже можно отлаживать.
например.
def say(word)
require 'debug'
puts word
end
Ответ 16
Мать всего отладчика - это простой старый экран печати. В большинстве случаев вы, вероятно, хотите только проверить некоторые простые объекты, быстрый и простой способ:
@result = fetch_result
p "--------------------------"
p @result
Это будет распечатывать содержимое @result для STDOUT с линией спереди для удобства идентификации.
Бонус, если вы используете инфраструктуру с поддержкой автозагрузки/перезагрузки, например Rails, вам даже не нужно перезагружать приложение. (Если код, который вы отлаживаете, не перезагружается из-за специфических настроек структуры)
Я считаю, что это работает для 90% использования для меня. Вы также можете использовать ruby-debug, но я нахожу его чрезмерным.
Ответ 17
Существует множество отладчиков с различными функциями, на основе которых вы делаете выбор. Мои приоритеты были удовлетворены любопытством, которое было:
- быстро понятная информация о том, как использовать
- интуитивно понятные шаги (например, легкий шаг в блоки)
- "шаг назад" (подглядывание частично удовлетворяет потребность)