如何调试ruby代码?

我运行Ubuntu 10.10。 我只是想调试一个简单的脚本。 在花了半天时间试图弄清楚如何做到这一点后,我放弃了。 我该怎么办?

我从Ubuntu存储库安装了ruby-dev
我运行了sudo gem install ruby-debugsudo gem install ruby-debug-ide

我尝试了几种不同的方法来完成这项工作。 我尝试了require 'ruby-debug' ,然后在代码中的某处设置debugger 。 但Ruby不会找到ruby-debug
我尝试设置vim-ruby-debugger ,这需要:Rdebugger myScript.rb才能执行:Rdebugger myScript.rb并允许我设置断点,但似乎没有办法使用该调试器执行我的代码。
我尝试使用NetBeans,每次设置项目并点击任何内容时,它都会崩溃。

所以,亲爱的社区:必须有一种方法来调试Ruby。 没有Rails。 没有什么花哨。 只是一些CLI脚本。 请帮助我,否则我将失去理智。

编辑: gem exec dir不在我的路径中。 所以,至少rdebug现在似乎有效。

Ruby-debug适用于1.8+,ruby-debug19适用于1.9+。

ruby-debug易于学习且非常有用。 您可以告诉应用程序在某个条件存在之前运行,然后让它中断,从而可以轻松找到零值或偶尔出现的其他条件。

从命令行使用rdebug appname ,您将在调试器提示符处结束。 如果你想运行到100行并停止你可以输入c 100并且调试器将设置一个临时断点,程序将运行然后停在那里,如果它在执行路径中。 一旦停止,临时断点将被清除。 如果你总是想要停在第100行,你可以做到b 100然后c ,调试器将设置一个永久断点,继续,然后在达到断点时停止。 您可以清除断点,设置在某些条件适用时发生的条件,等等。您可以键入n以跳到子程序调用的下一条指令,或者步进其中。 有些命令以各种方式显示变量的内容,因此请阅读文档。

从rdebug里面你可以放入一个IRB shell,你的变量已经填充好了,这样你就可以看看会发生什么。 从内部,您可以检查或设置值,帮助进行假设调整。 如果您从rdebug中执行此操作,则可以使用更改的值继续执行该程序并查看其行为方式。

IRB有它的位置,它非常适合尝试,但它不能代替调试器,就像调试器可以做一些IRB-ish的东西,但不会取代它。 这两个工具都是一个很好的组合,并且可以依靠打印语句或转储到日志文件。


Pry已经成为IRB和调试器的完美组合,值得研究。

与IRB相比,pry更好。 以下是从README中获取的内容。

Pry是Ruby的标准IRB shell的强大替代品。 它是从头开始编写的,提供了许多高级function,包括:

  • 源代码浏览(包括带有pry-doc gem的核心C源代码)
  • 文档浏览
  • 实时帮助系​​统
  • 在编辑器中打开方法(编辑方法类#方法)
  • 语法突出显示
  • 命令shell集成(从Pry中启动编辑器,运行git和rake)
  • 要点整合
  • 在州周围导航(cd,ls和friends)
  • 运行时调用(使用Pry作为开发人员控制台或调试器)
  • 异构对象支持(BasicObject实例,IClasses,…)
  • 强大而灵活的指挥系统
  • 能够查看和重播历史记录

  • 许多便利命令受到IPython,Smalltalk和其他高级REPL的启发

  • 大量插件,提供远程会话,完整调试function等。

Pry还旨在不仅仅是IRB的替代品; 它试图将REPL驱动的编程引入Ruby语言。 它目前没有像SLIME这样的工具那么强大,但是这是Pry的大方向。

Pry也相当灵活,允许重要的用户定制很容易将其设置为从具有readline方法的任何对象读取并写入任何具有puts方法的对象–Pry的许多其他方面也是可配置的,使其成为一个很好的选择实现自定义shell。

  1. 在Ruby中:

    ruby -rdebug myscript.rb然后,

    • b:放点断点
    • 和n(ext)或s(tep)和c(ontinue)
    • p(uts)用于显示
  2. 在Rails中:使用启动服务器

    • 脚本/服务器–debugger

      并在代码中添加调试器。

我用过Ruby的最好的调试器是内置于Netbeans的调试器。 你必须从Netbeans安装快速ruby调试器gem(我不确定它实际上是哪个gem,但是Netbeans会提示​​你这样做)。 我发现如果将Netbeans从内置的JRuby 1.4切换到系统的默认Ruby安装,它会更好。 还有值得一看的breakpointgem,从开发开始使用Ruby内置库logger也很有帮助。 祝好运!

使用IRB。 它是一个交互式的Ruby shell。 发生错误时,它会给出带有行号的跟踪,以便您可以知道代码的哪个部分出错。 您可以load源文件并运行各个方法以查看它们是否正常工作。 IRB提供有用的输出 – 当您输入一些代码时,它将评估表达式,然后使用.inspect打印返回值。

你可以看到Cheat表正在运行

  gem install cheat cheat rdebug 

这将显示使用rdebug的有用命令。

尝试默认的Ruby Debugger:

 ruby -r debug filename[, ...] 

或者如果是CLI脚本,只需更改其第一行:

 #!/usr/bin/env ruby 

至:

 #!/usr/bin/env ruby -rdebug 

并且脚本将在每个Exception上停止。

或者查看以下脚本示例:

 #!/usr/bin/env ruby class Hello def initialize( hello ) @hello = hello end def hello @hello end end salute = Hello.new( "Hello, Mac!" ) puts salute.hello 

您可以调试它,如下所示:

 # ruby -r debug hello.rb Debug.rb Emacs support available. hello.rb:3:class Hello (rdb:1) vl salute => nil (rdb:1) b 10 Set breakpoint 1 at hello.rb:10 (rdb:1) c Hello, Mac! 

来源: Ruby Debugger


或者使用lldb / gdb 。 请参阅下面将脚本回溯打印到前台的简单示例:

 echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby) 

如果效果更好,用gdb替换lldb 使用sudo前缀来调试非拥有进程。

Ruby调试有一段艰难的历史,其中充斥着仅支持特定次要MRI版本的工具。 值得庆幸的是,对于2.0及更高版本 ,您可以使用byebug 。

命令行用法很简单:运行byebug 。 您还可以编辑文件并将byebug函数调用放在要启动调试的任何位置。

有很多基于控制台的调试器,用于具有不同function的ruby,您可以根据这些调试器进行选择。

如果您非常需要 – 直观导航(例如下一步逐行移动,踩到块),以及快速易懂的文档 – 这对我来说最有用:

https://github.com/garmoshka-mo/pry-moves


我需要的其他很酷的function是从调试器内部进行调试。 就像我停止在Controller的行动中一样:

 def index list = Orders.for_user(current_user) => binding.pry end 

现在我想了解为什么list是空的? – 我可以运行debug Orders.for_user(current_user) ,看看那里发生了什么