2010-11-08 132 views
23

我运行Ubuntu 10.10。我只想调试一个简单的脚本。花了半天的时间试图找出如何做到这一点,我放弃了。我该怎么做?如何调试ruby代码?

我从Ubuntu库
我跑sudo gem install ruby-debugsudo gem install ruby-debug-ide

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

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

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

+0

相关的问题,虽然更侧重于printf调试:http://stackoverflow.com/questions/3955688/how-do-i-debug-ruby-scripts – 2010-11-08 22:18:15

回答

19

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-ISH的事情一样,但不会替代IRB-ISH的事情。这两种工具都是一个很好的组合,并且可以根据打印语句或转储到日志文件来打败他们。


Pry已经成为IRB的一个伟大的组合和debugger,是非常值得研究。

+0

由于习惯使用图形化调试器,ruby-debug起初使用起来有些尴尬,但最终证明它非常实用,并且确实发现了我的错误。谢谢你的提示! – bastibe 2010-11-09 08:26:39

+3

图形调试器很漂亮,但它们提供的功能必须在较低的级别上存在,否则它们将不会显示任何内容。我花了很多时间在命令行上,忘记了IDE中漂亮的布局。尽管如此,我仍然依靠命令行调试器向我展示真正隐藏在变量中的内容;我对我应该做什么有我的看法,但有时候翻译人员不同意我的看法,而且直到我告诉它不同之后,它才会获胜。 :-) – 2010-11-09 16:22:52

+0

请结帐[pry-byebug](https://github.com/deivid-rodriguez/pry-byebug),现在似乎是常态。 – Hassek 2016-07-16 02:37:37

4

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

+1

Netbeans简单地崩溃,每次我想运行它。如果我的调试需求会超过ruby-debug所提供的,那么我一定会检查它。 – bastibe 2010-11-09 08:23:47

2

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

+0

Pry比IRB更有效率。它允许更多的灵活性,并且它的社区正在增长(并且与IRB的社区进行互动)。 – jackyalcine 2014-03-29 19:02:14

12

pry与IRB相比更好。以下是从README获取。

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

  • 源代码浏览(包括与撬DOC宝石核心的C源)
  • 文档浏览
  • 在线帮助系统
  • 在编辑器打开方法(编辑方法类#方法)
  • 语法高亮
  • 命令外壳集成(编辑开始,运行git,并从内部镨耙Y)
  • 要点整合
  • 导航周围状态(CD,LS和朋友)
  • 运行时调用(使用撬作为一个开发者控制台或调试器)
  • 异国对象的支持(BasicObject情况下,IClasses,... )
  • 一个强大且灵活的命令系统
  • 能够查看和重放历史由IPython的,Smalltalk和OTH启发

  • 许多方便的命令呃先进的REPLs

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

撬起的目的还在于为比IRB替换更多;它试图将REPL驱动的编程带入Ruby语言。它目前还不如SLIME这样的工具对Lisp来说功能强大,但这是Pry正在前进的大方向。

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

+0

我同意,我没有很好地为ruby 1.9.3安装ruby-debug。 Pry开箱即用,非常易于使用。 – Nosh 2012-07-07 12:51:20

+0

巨型upvote在这里。非常类似于python的pdb.set_trace() - 我正在寻找类似的东西。正如Nosh所说的那样,在1.9.3中开箱即用。 – Koobz 2012-12-06 19:12:34

+0

“pry与IRB相比更好”:直到[Pry.debugger](https://github.com/nixme/pry-debugger)出现在2012年中期之前,这是真实的。 – 2013-10-28 19:14:08

7
  1. 在Ruby:

    红宝石-rdebug myscript.rb 然后,

    • B:把断点
    • 和n(分机)或S(TEP) and c(ontinue)
    • p(uts)for display
  2. 在Rails:用

    • 脚本/服务器--debugger

      启动服务器,并在代码中添加调试器。

1

你可以看到小抄运行

gem install cheat 
    cheat rdebug 

这会显示使用中,RDebug有用的命令。

1

尝试默认Ruby调试或者通过:

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) 

gdb更换lldb如果工作得更好。用前缀sudo来调试非拥有的进程。

+0

什么概念。使用内置的调试器。谁曾想到。无论如何,它为我工作。是ruby-debug作为默认调试器转入ruby命令,还是这是不同的? – labyrinth 2015-12-11 12:22:39

+0

不知道,我甚至没有Ruby开发人员,但我不得不在某些时候调试一些代码,而这些代码对我来说是未知的。 – kenorb 2015-12-11 12:39:54

0

Ruby调试有一个困难的历史,充满了只支持特定小版本MRI的工具。谢天谢地,从2.0开始,你可以使用byebug

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