Я скопіював з Інтернету наступний код Ruby і вніс кілька змін, але він не працює.
Що я можу зробити, щоб налагодити програму самостійно?
Я скопіював з Інтернету наступний код Ruby і вніс кілька змін, але він не працює.
Що я можу зробити, щоб налагодити програму самостійно?
Відповіді:
Використовуйте Pry ( GitHub ).
Встановити через:
$ gem install pry
$ pry
Потім додайте:
require 'pry'; binding.pry
у вашу програму.
Станом pry0.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].classirb), і ви отримаєте включити? (Масив) , який описує, що він робить.
Однак якщо документація не допомагає, ви, швидше за все, отримаєте хорошу відповідь, якщо зможете задати питання про те, як певна лінія не робить те, що слід, а не чому весь сценарій не робить того, що воно повинно.
видаляє всі речі
Ласкаво просимо у 2017 ^ _ ^
Гаразд, тому, якщо ви не проти спробувати новий IDE, ви можете зробити наступне безкоштовно .
launch.jsonдля використання "cwd"та та "program" поля за допомогою {workspaceRoot}макросу"showDebuggerOutput"та встановіть йогоtrue"debug.allowBreakpointsEverywhere": truevscode; це не те саме, що 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/ gdblike:
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% випадків використання для мене. Ви також можете використовувати рубін-налагодження, але я вважаю, що це переважає більшу частину часу.
Існує безліч налагоджувачів з різними можливостями, на основі яких ви робите вибір. Мої пріоритети були задоволені при-ходами, які були: