代码之家  ›  专栏  ›  技术社区  ›  bastibe

如何调试Ruby代码?

  •  26
  • bastibe  · 技术社区  · 14 年前

    我运行Ubuntu 10.10。我只想调试一个简单的脚本。在花了半天时间想办法解决这个问题之后,我放弃了。我该怎么办?

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

    我尝试了几种不同的方法来实现这一目标。我试过了 require 'ruby-debug' 然后设置 debugger 代码中的某个地方。但鲁比找不到 ruby-debug .
    我试过设置 vim-ruby-debugger ,这需要 时代 执行 :Rdebugger myScript.rb 并允许我设置断点,但似乎没有一种方法可以使用该调试器执行代码。
    我尝试使用NetBeans,每次我设置项目并点击任何东西时,它都会崩溃。

    所以,亲爱的社区:一定有调试Ruby的方法。不是铁轨。没什么特别的。只是一些CLI脚本。请帮助我,否则我失去理智。

    编辑: gem exec dir不在我的路径中。所以,至少RDebug现在可以工作了。

    9 回复  |  直到 6 年前
        1
  •  20
  •   the Tin Man    8 年前

    Ruby调试用于1.8+,Ruby-Debug19用于1.9+。

    Ruby调试易于学习,非常有用。您可以告诉应用程序在某个条件存在之前一直运行,然后让它中断,这样就很容易找到零值,或者其他偶尔出现的条件。

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

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

    IRB有它的位置,而且它非常适合尝试一些东西,但是它不是调试器的替代品,就像调试器可以做一些类似于IRB的事情,但不会取代它。这两种工具都是一种很好的组合,它们可以克服依赖打印语句或将数据转储到日志文件的困难。


    Pry 已经成为IRB和A的完美结合 debugger 很值得调查。

        2
  •  12
  •   the Tin Man    12 年前

    pry 比IRB更好。以下是从其 README .

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

    • 源代码浏览(包括核心C源代码和Pry Doc Gem)
    • 文档浏览
    • 实时帮助系统
    • 在编辑器中打开方法(编辑方法类方法)
    • 语法突出显示
    • 命令shell集成(在pry中启动编辑器、运行git和rake)
    • GIST集成
    • 浏览状态(CD、LS和朋友)
    • 运行时调用(使用pry作为开发人员控制台或调试器)
    • 异域对象支持(basicObject实例、iclasse…)
    • 强大灵活的指挥系统
    • 查看和重播历史记录的能力

    • 许多便利命令的灵感来自于ipython、smalltalk和其他高级repl

    • 提供远程会话、完整调试功能等的插件种类繁多。

    Pry的目标也不仅仅是替代IRB;它试图将repl驱动的编程引入Ruby语言。它目前不如Lisp的Slime这样的工具强大,但这正是Pry前进的方向。

    Pry也相当灵活,允许大量的用户自定义非常简单,可以将其设置为从具有readline方法的任何对象读取,并写入具有puts方法的任何对象-Pry的许多其他方面也可以配置,使其成为实现自定义shell的好选择。

        3
  •  6
  •   Jeet    12 年前
    1. 红宝石:

      ruby-rdebug myscript.rb 然后,

      • B:放置断点
      • 和n(ext)或s(tep)和c(ontinue)
      • P(UTS)显示
    2. 在Rails中:使用

      • 脚本/服务器--调试器

        并在代码中添加调试器。

        4
  •  4
  •   Daisy Sophia Hollman    14 年前

    我为Ruby使用过的最好的调试器是内置的 Netbeans . 您必须从NetBeans安装快速Ruby调试器gem(我不确定它实际上是哪个gem,但NetBeans会提示您安装)。我发现,如果将NetBeans从内置的JRuby1.4切换到系统的默认Ruby安装,效果会更好。还有 breakpoint 值得一看的gem,使用ruby内置库 logger 从一开始你的发展也是有帮助的。祝你好运!

        5
  •  2
  •   david4dev    14 年前

    使用IRB。它是一个交互式Ruby外壳。当出现错误时,它会给出一个带有行号的跟踪,这样您就可以知道代码的哪个部分出错了。你可以 load 您的源文件和运行单个方法以查看它们是否正常工作。IRB提供有用的输出-当您输入一些代码时,它将计算表达式,然后使用 .inspect .

        6
  •  1
  •   Ale mrzli    10 年前

    你可以看到作弊记录在运行

      gem install cheat
      cheat rdebug
    

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

        7
  •  1
  •   kenorb    9 年前

    尝试默认的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 如果效果更好。前缀为 sudo 调试非拥有的进程。

        8
  •  0
  •   Xiong Chiamiov    7 年前

    Ruby调试有一段困难的历史,其中充斥着仅支持特定次要版本MRI的工具。谢天谢地,对于2.0及更高版本,您可以使用 byebug .

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

        9
  •  0
  •   Daniel Garmoshka    6 年前

    Ruby有很多基于控制台的调试器,它们具有不同的特性,您可以根据这些特性进行选择。

    如果您有重要的需要-直观的导航(例如,下一步逐行移动,进入块),以及快速可理解的文档-这对我来说是最好的:

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


    我需要的另一个很酷的特性是从调试器内部进行调试。就像我在控制器的动作中停下来:

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

    现在我想知道为什么 list 是空的吗?-我可以跑步 debug Orders.for_user(current_user) 看看那里发生了什么