Answers:
通过以下方式安装:
$ 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中:
ruby -rdebug myscript.rb
然后,
b <line>
:放置断点 n(ext)
或s(tep)
和c(ontinue)
p(uts)
用于显示(如perl调试)
在Rails中:使用以下命令启动服务器
script/server --debugger
并添加debugger
代码。
-r debug
是垃圾?
facets
,并在gem要求中使用特定版本,但是没有成功。对于古老的Rails应用程序ruby-debug
来说有点讨厌,但是可以完成工作。
通过提高例外调试是容易得多不是通过眯眼print
日志语句,对于大多数的错误,它通常快得多比打开了一个IRB调试像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
not 类的对象使用方法Nil
)。
不幸的是,由于此错误的编写方式(undefined method "bar" for Nil:nilClass
),很容易使人误以为该错误与bar
besing有关undefined
。如果不仔细阅读,此错误会导致初学者错误地研究bar
on上方法的详细信息,从而Foo
完全丢失了表明对象属于错误类的错误部分(在本例中为nil)。通过完全读取错误消息可以很容易避免这种错误。
摘要:
在开始任何调试之前,请务必仔细阅读整个错误消息。这意味着:始终检查类型的对象的一个错误消息首先,那么它的方法,前开始侦探到任何堆栈跟踪或代码行,你认为该错误可能发生。那5秒钟可以为您节省5个小时的挫败感。
tl; dr:不要斜视打印日志:引发异常或改用irb调试器。通过在调试之前仔细阅读错误来避免出现兔子洞。
尽可能打印出变量。(这称为printf调试)您可以通过运行
STDERR.puts x.inspect
要么
STDERR.puts "Variable x is #{x.inspect}"
如果要使其更易于键入,则可能要使用示例宝石。
打开警告。如果您正在运行ruby
,请使用-w
开关(例如ruby -w script.rb
)运行它。如果从irb运行它,并且使用的是1.9.2之前的ruby版本,请$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 1.9+的ruby-debug19),因为它可以轻松停止正在运行的程序,检查变量,放入irb,然后继续运行。
要轻松调试Ruby Shell脚本,只需将其第一行更改为:
#!/usr/bin/env ruby
至:
#!/usr/bin/env ruby -rdebug
然后,每当显示调试器控制台时,您都可以选择:
c
对于继续(到下一个异常,断点或以下行:)debugger
,n
对于下一行,w
/ where
显示框架/调用堆栈,l
显示当前代码,cat
显示要点。h
寻求更多帮助。另请参阅:使用ruby-debug进行调试,ruby-debug gem的关键快捷方式。
如果脚本刚刚挂起并且您需要回溯,请尝试使用lldb
/ gdb
like:
echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby)
然后检查您的进程前景。
如果效果更好,请替换lldb
为gdb
。带有sudo
调试非自有进程的前缀。
如果您使用的是RubyMine,则调试ruby脚本非常简单明了。
假设您有一个Ruby脚本hello_world.rb
在第6行设置一个断点,如下所示。
现在,您只需启动调试器即可运行脚本:
然后,当执行达到断点时,您将能够检查变量等。
好吧,ruby标准库具有易于使用的类似gdb的控制台调试器:http : //ruby-doc.org/stdlib-2.1.0/libdoc/debug/rdoc/DEBUGGER__.html 无需安装任何额外的gem。Rails脚本也可以通过这种方式进行调试。
例如
def say(word)
require 'debug'
puts word
end
您可以根据需要选择具有不同功能的许多调试器。我的优先事项是撬动,这是: