我如何调试Ruby脚本? [关闭]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何调试Ruby脚本? [关闭]相关的知识,希望对你有一定的参考价值。
我从Internet复制了以下Ruby代码并进行了一些更改。
但它不起作用!
请帮忙。我该怎么做才能自己调试程序?
安装途径:
$ gem install pry
$ pry
然后加:
require 'pry'; binding.pry
进入你的程序。
从pry
0.12.2开始,没有导航命令,如next
,break
等。其他一些宝石还提供了这个,例如参见pry-byedebug
。
我强烈推荐这个视频,以便选择适当的工具来调试我们的代码。
https://www.youtube.com/watch?v=GwgF8GcynV0
就个人而言,我将在本视频中重点介绍两个重要主题。
- Pry非常适合调试数据,“pry是一个数据浏览器”(原文如此)
- 调试器似乎更好地逐步调试。
那是我的两分钱!
要轻松调试Ruby shell脚本,只需更改其第一行:
#!/usr/bin/env ruby
至:
#!/usr/bin/env ruby -rdebug
然后每次显示调试器控制台时,您都可以选择:
c
for Continue(到下一个例外,断点或者行:debugger
),- 下一行的
n
, w
/where
显示帧/调用堆栈,l
来显示当前代码,cat
展示了捕获点。h
获得更多帮助。
另见:Debugging with ruby-debug,Key shortcuts for ruby-debug gem。
如果脚本只是hangs并且您需要回溯,请尝试使用lldb
/ gdb
,如:
echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby)
然后检查您的进程前景。
如果效果更好,用lldb
替换gdb
。使用sudo
前缀来调试非自有进程。
从Ruby 2.4.0开始,在任何Ruby程序中都可以更轻松地启动IRB REPL会话。将这些行放在要调试的程序中的位置:
require 'irb'
binding.irb
您可以运行Ruby代码并打印出局部变量。键入Ctrl + D或quit
以结束REPL并让Ruby程序继续运行。
您还可以使用puts
和p
在程序运行时打印出程序中的值。
如果您使用的是RubyMine,则调试ruby脚本非常简单明了。
假设你有一个Ruby脚本hello_world.rb
1. Set breakpoints
在第6行设置断点,如下所示。
2. Start debugging
现在您可以启动调试器来运行脚本:
3. Inspect variables, etc.
然后当执行到达断点时,您将能够检查变量等。
Further information for your reference
- 如果你想use RubyMine to do remote debugging,你可以这样做。
- 如果你想要use RubyMine to remote debug rails running inside a docker,它也很简单。
printf调试
关于调试技术一直存在争议,有些人喜欢通过print语句调试,有些人喜欢深入研究调试器。
我建议你试试这两种方法。
实际上有一位老Unix的人最近说过,在某些方面,printf调试对他来说是一种更快捷的方式。
但是如果你是一个新工作并且需要了解大量的代码,那么在这里一步一步,在这里和那里放置一些断点,以及它如何工作是非常有用的。
它应该让您了解代码是如何编织的。
如果您是其他人的软件新手,可能会帮助您逐步完成。
你会很快发现他们是否以巧妙的方式安排它,或者这只是一堆狗屎。
好吧,ruby标准库有一个易于使用的类似gdb的控制台调试器:http://ruby-doc.org/stdlib-2.1.0/libdoc/debug/rdoc/DEBUGGER__.html无需安装任何额外的宝石。 Rails脚本也可以这样调试。
EG
def say(word)
require 'debug'
puts word
end
所有调试器的母亲都是普通的旧打印屏幕。大多数情况下,您可能只想检查一些简单的对象,快速简便的方法是这样的:
@result = fetch_result
p "--------------------------"
p @result
这将打印出@result到STDOUT的内容,前面有一行,便于识别。
如果您使用像Rails这样的自动加载/重新加载功能的框架,您甚至不需要重新启动应用程序。 (除非由于框架特定设置而未重新加载您正在调试的代码)
我发现这适用于90%的用例。你也可以使用ruby-debug,但我发现它在大多数情况下都是过度的。
有许多调试器具有不同的功能,您可以根据这些功能进行选择。我的优先事项对pry-moves满意,这是:
- 关于如何使用的快速可理解的信息
- 直观的步骤(如轻松踩到块)
- “退后一步”(撬动部分满足需要)
- 在Ruby中:
ruby -rdebug myscript.rb
然后,b <line>
:提出突破点 和n(ext)
或s(tep)
和c(ontinue)
p(uts)
用于展示 (比如perl调试) - 在Rails中:使用启动服务器
script/server --debugger
并在代码中添加debugger
。
作为栏杆推荐:使用撬!我只能就此达成一致。
pry是比irb更好的代表。
你需要添加
require 'pry'
到您的源文件,然后通过添加在源代码中插入断点
binding.pry
在您想要查看事物的地方(这就像在经典IDE环境中触发断点)
一旦你的程序击中了
binding.pry
在你的程序的所有上下文中,你将直接进入pry repl,这样你就可以简单地探索周围的一切,调查所有对象,改变状态,甚至动态更改代码。
我相信你不能改变你当前所处方法的代码,所以你可以遗憾地不改变下一行的执行。但无论如何,好的红宝石代码往往是单行;-)
通过引发异常进行调试比通过print
日志语句眯眼更容易,对于大多数错误,它通常比打开像pry
或byebug
这样的irb调试器快得多。这些工具不应该是你的第一步。
Debugging Ruby/Rails Quickly:
1.快速方法:然后提高Exception
和.inspect
的结果
调试Ruby(尤其是Rails)代码的最快方法是在代码的执行路径上raise
异常,同时在方法或对象上调用.inspect
(例如foo
):
raise foo.inspect
在上面的代码中,raise
触发一个停止执行代码的Exception
,并返回一条错误消息,该错误消息可以方便地包含有关您尝试调试的行上的对象/方法(即.inspect
)的foo
信息。
这种技术对于快速检查一个对象或方法(例如它是nil
?)以及立即确认一行代码是否甚至在给定的上下文中完全执行是有用的。
2.后备:使用像byebug
或pry
这样的ruby IRB调试器
只有在获得有关代码执行流程状态的信息后,才应考虑转移到像pry
或byebug
这样的ruby gem irb调试器,您可以在其中深入研究执行路径中对象的状态。
General Beginner Advice
当您尝试调试问题时,总是建议:阅读!@#$ ing错误消息(RTFM)
这意味着在行动之前仔细和完整地阅读错误消息,以便您了解它试图告诉您的内容。调试时,请在阅读错误消息时按此顺序询问以下心理问题:
- 错误引用了哪个类? (即我有正确的对象类或是我的对象
nil
?) - 错误引用了什么方法? (即它们是方法中的类型;我可以在此类型/类对象上调用此方法吗?)
- 最后,使用我在前两个问题中可以推断的内容,我应该调查哪些代码行? (记住:堆栈跟踪中的最后一行代码不一定是问题所在。)
在堆栈跟踪中,要特别注意来自项目的代码行(例如,如果使用Rails,则以app/...
开头的行)。 99%的时间问题出在你自己的代码上。
为了说明为什么这个顺序的解释很重要......
E.g. a Ruby error message that confuses many beginners:
您执行在某些时候执行的代码:
@foo = Foo.new
...
@foo.bar
并且您收到一条错误消息:
undefined method "bar" for Nil:nilClass
初学者看到这个错误,并认为问题是方法bar
未定义。不是。在这个错误中,重要的真实部分是:
for Nil:nilClass
for Nil:nilClass
意味着@foo
以上是关于我如何调试Ruby脚本? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章