Я скопіював з Інтернету наступний код Ruby і вніс кілька змін, але він не працює.
Що я можу зробити, щоб налагодити програму самостійно?
Я скопіював з Інтернету наступний код Ruby і вніс кілька змін, але він не працює.
Що я можу зробити, щоб налагодити програму самостійно?
Відповіді:
Використовуйте Pry ( GitHub ).
Встановити через:
$ gem install pry
$ pry
Потім додайте:
require 'pry'; binding.pry
у вашу програму.
Станом pry
0.12.2 однак, є не команди немає навігації , такі як next
, break
і т.д. Деякі інші дорогоцінні камені , крім того , забезпечити це, дивись, наприклад pry-byedebug
.
binding.pry
. Він також оснащений кольоровим завершенням, пошуку документації та можливістю динамічного редагування та перезавантаження методу ..
Pry
/ byebug
чудово, але не як ваш перший крок при налагодженні. У більшості випадків збільшення винятку з raise object.inspect
вирішить вашу проблему швидше, ніж відкриття сеансу irb. Я рекомендую використовувати лише налагоджувачі консолі ще раз, коли прості рішення, такі як підняття виключення, не зможуть вирішити вашу проблему.
pry
? Я не міг знайти, як це зробити; і саме цього я очікую від налагоджувача.
У Рубі:
ruby -rdebug myscript.rb
тоді,
b <line>
: поставити крапку n(ext)
або s(tep)
іc(ontinue)
p(uts)
для відображення(як-от налагодження perl)
У Rails: Запустіть сервер за допомогою
script/server --debugger
і додати debugger
в код.
-r debug
це сміття?
facets
до дорогоцінних каменів, і це не вдалося. Для стародавніх додатків Rails ruby-debug
це трохи неприємно, але виконує роботу.
Як баністери рекомендується: використовуйте прий! Я можу лише погодитися з цим.
pry - це набагато краще відбиття, ніж irb.
Вам потрібно додати
require 'pry'
у свій вихідний файл, а потім додайте точку перерви у вихідний код, додавши
binding.pry
в тому місці, де ви хочете подивитися на речі (це як запуск точки перелому в класичному середовищі IDE)
Як тільки ваша програма потрапить на
binding.pry
рядок, ви будете кинуті прямо у відбиток програм, з усім контекстом вашої програми прямо під рукою, так що ви можете просто вивчити все навколо, дослідити всі об'єкти, змінити стан і навіть змінити код на льоту.
Я вважаю, що ви не можете змінити код методу, який ви зараз перебуваєте, тому ви можете, на жаль, не змінити наступний рядок, який буде виконуватися. Але гарний рубіновий код все одно має тенденцію бути однорядним ;-)
Налагодження шляхом підвищення винятків є набагато простіше , ніж мружачись черезprint
заяву журналу, і для більшості помилок, його зазвичай набагато швидше , ніж відкриття КРПА відладчикаякpry
абоbyebug
. Ці інструменти не завжди повинні бути вашим першим кроком.
Exception
тоді і .inspect
його результатШвидкий спосіб налагодження Ruby (особливо Rails) код для raise
виключення по шляху виконання вашого коду при виклику .inspect
на метод або об'єкт (наприклад foo
):
raise foo.inspect
У наведеному вище коді raise
запускає, Exception
що зупиняє виконання вашого коду , і повертає повідомлення про помилку, яке зручно містить .inspect
інформацію про об'єкт / метод (тобто foo
) у рядку, який ви намагаєтеся налагодити.
Ця методика корисна для швидкого вивчення об'єкта чи методу ( наприклад, це nil
? ) Та для негайного підтвердження того, чи рядок коду взагалі виконується в заданому контексті.
byebug
абоpry
Тільки після того, як ви отримаєте інформацію про стан потоку виконання ваших кодів, вам слід розглянути можливість переходу до налагоджувача ruby gem irb, як pry
або, byebug
де ви зможете більш глибоко заглибитися у стан об'єктів у вашому шляху виконання.
Коли ви намагаєтеся налагодити проблему, корисна порада завжди: читайте повідомлення про помилку! @ # $ Ing (RTFM)
Це означає, що уважно і повністю читайте повідомлення про помилки, перш ніж діяти, щоб зрозуміти, що він намагається сказати вам. Під час налагодження задайте такі ментальні запитання в такому порядку , читаючи повідомлення про помилку:
nil
? ) У сліді стека зверніть особливу увагу на рядки коду, що надходять з вашого проекту (наприклад, рядки, починаючи з, app/...
якщо ви використовуєте Rails). 99% часу проблема пов'язана з власним кодом.
Щоб проілюструвати, чому інтерпретувати в цьому порядку важливо ...
Ви виконуєте код, який у якийсь момент виконується як такий:
@foo = Foo.new
...
@foo.bar
і ви отримуєте помилку, яка говорить:
undefined method "bar" for Nil:nilClass
Початківці бачать цю помилку і вважають, що проблема bar
не визначена . Це не. У цій помилці справжня частина, яка має значення:
for Nil:nilClass
for Nil:nilClass
означає, що @foo
це Ніл! @foo
не є Foo
змінною екземпляра! У вас є об’єкт, який є Nil
. Коли ви бачите цю помилку, просто рубін намагається сказати вам, що метод bar
не існує для об'єктів класу Nil
. (ну так! оскільки ми намагаємось використовувати метод для об’єкта класу Foo
не Nil
).
На жаль, через те, як написана ця помилка ( undefined method "bar" for Nil:nilClass
), її легко влучити в думку, що ця помилка пов'язана з bar
буттям undefined
. Якщо не читати уважно, ця помилка призводить до того, що початківці помилково переходять до деталей bar
методуFoo
, повністю не пропускаючи ту частину помилки, яка натякає на те, що об'єкт неправильного класу (у даному випадку: nil). Це помилка, яку легко уникнути, прочитавши повідомлення про помилки в повному обсязі.
Підсумок:
Завжди уважно читайте все повідомлення про помилку перед початком налагодження. Це означає: Завжди спочатку перевіряйте тип класу об'єкта у повідомленні про помилку , а потім його методи , перш ніж ви почнете вмикатись у будь-який стек-трек чи рядок коду, де, на вашу думку, може статися помилка. Ці 5 секунд можуть заощадити 5 годин розчарування.
tl; dr: Не косіть журнали друку: створюйте винятки або використовуйте налагоджувач irb замість цього. Уникайте кролячих дірок, уважно читаючи помилки перед налагодженням.
Роздрукуйте змінні, коли це можливо. (Це називається налагодження printf) Це можна зробити, запустивши
STDERR.puts x.inspect
або
STDERR.puts "Variable x is #{x.inspect}"
Якщо ви хочете , щоб зробити це простіше набрати, то ви можете використовувати exemplor камінь.
Увімкніть попередження Якщо ви працюєте, ruby
то запустіть його за допомогою -w
перемикача (наприклад, ruby -w script.rb
). Якщо ви запускаєте його з irb і використовуєте версію рубіну до 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), і ви отримаєте включити? (Масив) , який описує, що він робить.
Однак якщо документація не допомагає, ви, швидше за все, отримаєте хорошу відповідь, якщо зможете задати питання про те, як певна лінія не робить те, що слід, а не чому весь сценарій не робить того, що воно повинно.
видаляє всі речі
Ласкаво просимо у 2017 ^ _ ^
Гаразд, тому, якщо ви не проти спробувати новий IDE, ви можете зробити наступне безкоштовно .
launch.json
для використання "cwd"
та та "program"
поля за допомогою {workspaceRoot}
макросу"showDebuggerOutput"
та встановіть йогоtrue
"debug.allowBreakpointsEverywhere": true
vscode
; це не те саме, що Visual Studio . Це безкоштовно, невелика вага і, як правило, позитивно сприймається.View->Extensions
.vscode
ми створимо каталог через командний рядок, який називається, і там ми будемо, але файл, який називається, launch.json
де ми будемо зберігати деякі параметри конфігурації.
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
}
]
}
File->Preferences->Settings
(або Ctrl,) та прокручуємо, поки не дістанешся до Debug
розділу. Розгорніть і шукайте поле під назвою "debug.allowBreakpointsEverywhere"
- виберіть це поле та натисніть на маленьку піктограму, що виглядає олівцем, і встановіть її true
.Виконуючи усі ці цікаві речі, ви зможете встановити точки перерви та налагодження в меню, подібному до цього, на середину 2017 року та більш темній темі: з усіма цікавими матеріалами, такими як стек викликів, переглядач змінних тощо.
Найбільший PITA - це 1) встановлення попередніх запитів і 2) запам'ятовування для налаштування .vscode\launch.json
файлу. Тільки №2 повинен додавати будь-який багаж до майбутніх проектів, і ви можете просто скопіювати достатньо загальну конфігурацію, як перелічена вище. Напевно, є більш загальне розташування конфігурацій, але я не знаю, що знаходиться вгорі голови.
Я настійно рекомендую це відео, щоб на даний момент вибрати відповідний інструмент для налагодження нашого коду.
https://www.youtube.com/watch?v=GwgF8GcynV0
Особисто я б виділив дві великі теми у цьому відео.
Це мої два центи!
Всі інші відповіді вже дають майже все ... Просто невелике доповнення.
Якщо ви хочете отримати ще один IDE-подібний налагоджувач (не-CLI) і не боїтеся використовувати Vim в якості редактора, я пропоную плагін Vim Ruby Debugger для цього.
Його документація досить проста, тому переходьте за посиланням і дивіться. Коротше кажучи, це дозволяє встановити точку розриву в поточному рядку в редакторі, переглядати локальні змінні у чудовому вікні під час паузи, переходити / входити - майже всі звичайні функції налагодження.
Для мене було дуже приємно використовувати цей відладчик vim для налагодження програми Rails, хоча багаті здібності реєстраторів Rails майже позбавляють від нього потреби.
Я щойно виявив цей дорогоцінний камінь (перетворює Pry в налагоджувач для MRI Ruby 2.0+)
https://github.com/deivid-rodriguez/pry-byebug
Встановити за допомогою:
gem install pry-byebug
а потім використовувати точно так само pry
, позначте лінію, яку потрібно перервати:
require 'pry'; binding.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.
-w
прапор (попередження)irb
це відмінне стартове місце. Спробуйте використовувати irb з невеликими сумнівними шматками. Я люблю ruby-debug (ruby-debug19 для Ruby 1.9+), тому що це легко зупинити запущену програму, вивчити змінні, потрапити в irb, а потім продовжувати працювати.
Щоб легко налагодити сценарій оболонки Ruby, просто змініть його перший рядок з:
#!/usr/bin/env ruby
до:
#!/usr/bin/env ruby -rdebug
Потім кожен раз, коли відображається консоль налагодження, ви можете вибрати:
c
для продовження (до наступного винятку, точки перерви або рядка з:) debugger
,n
для наступного рядка,w
/ where
для відображення кадру / стека виклику,l
щоб показати поточний код,cat
показувати точки лову.h
для отримання додаткової довідки.Дивіться також: Налагодження за допомогою налагодження ruby-debug , ключові ярлики для дорогоцінного каміння ruby-debug .
Якщо сценарій просто зависає, і вам потрібен зворотній слід, спробуйте скористатися lldb
/ gdb
like:
echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby)
а потім перевірте передній план процесу.
Замініть lldb
на, gdb
якщо працює краще. Префікс sudo
для налагодження процесу, що не належить до власності.
Починаючи з Ruby 2.4.0, легше запустити сеанс відповіді IRB в середині будь-якої програми Ruby. Поставте ці рядки в точку програми, яку потрібно налагодити:
require 'irb'
binding.irb
Ви можете запустити Ruby-код і роздрукувати локальні змінні. Введіть Ctrl + D або, quit
щоб закінчити REPL і нехай програма Ruby продовжує працювати.
Ви також можете використовувати puts
та p
роздрукувати значення зі своєї програми під час роботи програми.
Якщо ви використовуєте RubyMine , налагодження рубінових скриптів просте і просте.
Припустимо, у вас є сценарій Ruby hello_world.rb
Встановіть точку розриву в рядку 6, як показано нижче.
Тепер ви можете просто запустити налагоджувач для запуску сценарію:
Тоді, коли виконання досягне точки розриву, ви зможете перевірити змінні тощо.
налагодження printf
Завжди існувала суперечка щодо методів налагодження, деякі люблять налагоджувати виписки на друку, інші люблять копати глибоко за допомогою налагоджувача.
Я б запропонував спробувати обидва підходи.
Насправді один із старих чоловіків Unix нещодавно сказав, що налагодження printf - це більш швидкий шлях до нього в певні моменти.
Але якщо ви новачок на якійсь роботі і вам потрібно зрозуміти велику частину коду, тоді дійсно корисно переступити туди, поставивши туди-сюди деякі точки прориву, разом з нею, як це працює.
Це повинно дати вам деяке розуміння того, як плетений код.
Якщо ви новачок у програмі інших народів, це може допомогти вам перейти туди.
Ви швидко дізнаєтесь, чи влаштували вони це розумно, чи це просто купа лайна.
Добре, у рубіновій стандартній конвеєрі є простий у використанні налагоджувач консолі, що нагадує gdb: http://ruby-doc.org/stdlib-2.1.0/libdoc/debug/rdoc/DEBUGGER__.html Не потрібно встановлювати зайвих дорогоцінних каменів. Сценарії Rails можуть бути налагоджені і таким чином.
напр
def say(word)
require 'debug'
puts word
end
Мати всіх налагоджувачів - це звичайний старий екран друку. Здебільшого, напевно, ви хочете оглянути лише прості об’єкти, швидкий і простий спосіб такий:
@result = fetch_result
p "--------------------------"
p @result
Це дозволить роздрукувати вміст @result в STDOUT з рядком навпроти для легкої ідентифікації.
Бонус, якщо ви використовуєте рамку, здатну до автоматичного завантаження / перезавантаження, як Rails, вам навіть не потрібно буде перезавантажувати додаток. (Якщо код, який ви налагоджуєте, не перезавантажується через специфічні параметри рамки)
Я вважаю, що це працює для 90% випадків використання для мене. Ви також можете використовувати рубін-налагодження, але я вважаю, що це переважає більшу частину часу.
Існує безліч налагоджувачів з різними можливостями, на основі яких ви робите вибір. Мої пріоритети були задоволені при-ходами, які були: