如何调试ruby代码?

时间:2010-11-08 13:01:56

标签: ruby debugging

我运行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并允许我设置断点,但似乎没有办法执行我的代码使用该调试器 我尝试使用NetBeans,每次设置项目时都会崩溃,并点击任何内容。

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

修改 宝石高管目录不在我的路上。所以,至少rdebug现在似乎有用了。

9 个答案:

答案 0 :(得分:20)

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

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

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

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

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


Pry已成为IRB与debugger的完美结合,非常值得研究。

答案 1 :(得分:12)

与IRB相比,

pry更好。以下内容来自README

  

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

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

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

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

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

     

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

答案 2 :(得分:6)

  1. 在Ruby中:

    ruby​​ -rdebug myscript.rb 然后,

    • b:放点断点
    • 和n(ext)或s(tep)和c(ontinue)
    • p(uts)for display
  2. 在Rails中:使用

    启动服务器
    • script / server --debugger

      并在代码中添加调试器。

答案 3 :(得分:4)

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

您可以看到运行的备忘单

  gem install cheat
  cheat rdebug

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

答案 6 :(得分:1)

通过以下方式尝试默认的Ruby Debugger:

ruby -r debug filename[, ...] 

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

#!/usr/bin/env ruby

为:

#!/usr/bin/env ruby -rdebug

并且脚本将在每个异常停止。

或者查看以下脚本示例:

#!/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) v l
  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)

如果效果更好,请将lldb替换为gdb。使用sudo的前缀来调试非自有进程。

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

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

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

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

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

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