代码之家  ›  专栏  ›  技术社区  ›  Andrew Grimm atk

如何调试Ruby脚本?

  •  144
  • Andrew Grimm atk  · 技术社区  · 14 年前

    我从互联网上复制了下面的Ruby代码并做了一些更改。

    但它不起作用!

    请帮忙。我可以自己做些什么来调试程序?

    17 回复  |  直到 6 年前
        1
  •  131
  •   kenorb    10 年前

    使用 Pry ( GitHub )

    安装通过:

    $ gem install pry
    $ pry
    

    然后添加:

    require 'pry'
    

    进入你的程序。

        2
  •  110
  •   Andrew Marshall    13 年前
    1. 露比:

      ruby -rdebug myscript.rb 
      

      然后,

      • b <line> :放置断点
      • n(ext) s(tep) c(ontinue)
      • p(uts) 用于显示

      (类似于Perl调试)

    2. 在Rails中:使用

      script/server --debugger
      

      并添加 debugger 在代码中。

        3
  •  53
  •   edx    12 年前

    如栏杆建议:使用撬棍! 我只能同意这一点。

    Pry是一个比IRB更好的repl。

    你需要添加

    require 'pry'
    

    到源文件 然后通过添加

    binding.pry
    

    在你想看东西的地方 (这类似于在经典的IDE环境中触发断点)

    一旦你的程序点击

    绑定
    

    行,你会被扔到撬锁里, 所有程序的上下文都在手边, 这样你就可以简单地探索周围的一切,调查所有的物体, 更改状态,甚至可以动态更改代码。

    我相信你不能改变你目前所处方法的代码, 所以很遗憾,您不能更改要执行的下一行。 但是好的Ruby代码通常都是单行的;-)

        4
  •  28
  •   Kelsey Hannan    8 年前

    通过引发异常进行调试 容易得多 比眯着眼睛看 print 日志语句,对于大多数错误,它通常 快得多 比像这样打开IRB调试器 pry byebug . 这些工具不应该是你的第一步。


    快速调试Ruby/Rails:

    1。快速方法:提高 Exception 然后 .inspect 其结果

    这个 最快的 调试Ruby(尤其是Rails)代码的方法是 raise 调用时沿着代码的执行路径出现异常 检查 方法或对象(例如 foo ):

    raise foo.inspect
    

    在上述代码中, 提升 触发一个 例外 那个 停止代码的执行 ,并返回一条错误消息,其中方便地包含 检查 关于对象/方法的信息(即 )在您尝试调试的行上。

    这项技术对 迅速地 检查对象或方法( 例如 nil ? )并立即确认某一行代码是否在给定的上下文中执行。

    2。回退:使用红宝石 IRB 类调试器 小虫 窥探

    只有在您获得了关于代码执行流状态的信息之后,才应该考虑移动到类似RubyGemIRB调试器 窥探 小虫 在这里,您可以更深入地研究执行路径中对象的状态。


    一般初学者建议

    当您尝试调试问题时,好的建议是始终: 阅读!@#$ing错误消息(RTFM)

    这意味着读取错误消息 仔细地 完全地 在你行动之前 明白它想告诉你什么。 调试时,问以下心理问题, 按此顺序 ,读取错误消息时:

    1. 什么 错误是否参考?(即 我有正确的对象类还是我的对象 ? )
    2. 什么 方法 错误是否参考?(即 它们是方法中的A类型;我可以对此类型/类的对象调用此方法吗? )
    3. 最后,用我最后两个问题的推论,什么 代码行 我应该调查一下吗?(请记住:堆栈跟踪中的最后一行代码不一定是问题所在。)

    在堆栈跟踪中,请特别注意来自项目的代码行(例如以 app/... 如果你在使用铁轨)。99%的时候问题出在你自己的代码上。


    解释原因 按此顺序 很重要…

    例如,让许多初学者感到困惑的Ruby错误消息:

    您执行的代码在某个时刻执行如下:

    @foo = Foo.new
    
    ...
    
    @foo.bar
    

    你会得到一个错误,说明:

    undefined method "bar" for Nil:nilClass

    初学者看到这个错误,认为问题在于方法 bar 未定义 . 不是这样。 在这个错误中,真正重要的部分是:

    for Nil:nilClass

    对于零:nilclass 意味着 @foo 是零! @福 不是一个 Foo 实例变量!你有一个物体 Nil . 当您看到这个错误时,它只是Ruby试图告诉您 酒吧 类的对象不存在 . (好吧!因为我们试图对类的对象使用方法 )

    不幸的是,由于这个错误是如何写入的( nil:nilclass的未定义方法“bar” )很容易被欺骗以为这个错误与 酒吧 存在 undefined . 如果不仔细阅读,此错误会导致初学者错误地深入了解 酒吧 方法对 完全缺少提示对象属于错误类的错误部分(在本例中为nil)。这是一个很容易通过阅读错误消息来避免的错误。

    总结:

    总是小心 阅读 整个的 错误信息 在开始任何调试之前。这意味着:总是检查 错误消息中对象的类型 第一 然后 方法 , 之前 您开始对您认为可能发生错误的任何stacktrace或代码行进行调查。这5秒钟可以帮你节省5个小时的沮丧。

    DR: 不要斜视打印日志:而是引发异常。调试前仔细阅读错误,避免出现兔子洞。

        5
  •  19
  •   Andrew Marshall    13 年前
    1. 尽可能打印出变量。(这称为printf调试)您可以通过运行

      STDERR.puts x.inspect
      

      STDERR.puts "Variable x is #{x.inspect}"
      

      如果要使键入更容易,则可以使用 exemplor 宝石。

    2. 打开警告。如果你在跑步 ruby 然后用 -w 开关(如: ruby -w script.rb )如果您是从IRB运行它,并且您使用的是1.9.2之前的Ruby版本,请键入 $VERBOSE = true 在课程开始时。如果您拼错了一个实例变量,一旦出现警告,您将得到

      警告:实例变量 @valeus 未初始化

    3. 理解二元杂碎的概念(以下引语来自 Practices of an Agile Developer )

      把问题空间分成两半,看哪一半包含问题。然后再把那一半分成两半,然后重复。

    4. 如果你成功地使用了二进制斩波,你可能会发现有一条线不能达到你期望的效果。例如

      [1, 2, 3].include?([1,2])
      

      给出的值为 false 即使你认为它会回来 true . 在这种情况下,您可能需要查看文档。文档网站包括 ruby-doc.org APIdock . 在后一种情况下,您将键入 include? 在靠近右上角的放大镜旁边,选择 包括在内? 哪个有 Array 在它下面(如果你不知道什么课 [1, 2, 3] IS型 [1, 2, 3].class 在IRB),你可以 include? (Array) 它描述了它的作用。

      但是,如果文档不起作用,那么如果您可以问一个问题,即特定行如何不做它应该做的事情,而不是为什么整个脚本不做它应该做的事情,那么您更有可能得到一个好的答案。

        6
  •  7
  •   kayleeFrye_onDeck    8 年前

    删除所有内容

    欢迎来到2017年^^

    好吧,如果您不反对尝试新的IDE,您可以为 free>执行以下操作。

    快速指示

    1. 安装vscode
    2. 如果还没有安装Ruby开发工具包
    3. 为vscode安装ruby、ruby linter和ruby rubocop扩展
    4. 手动安装任何gems rubyide/vscode ruby specify,if needed
    5. 配置您的 launch.json to use “cwd” and and “program” fields using the workspaceroot macro
    6. 添加一个名为“ShowDebuggeRoutput”的字段,然后将其设置为 true
    7. 在调试首选项中的任意位置启用断点,如“debug.allowbreakpointsVerywhere”:true

    详细说明

    1. 下载 Visual Studio code aka vscode ;这与Visual Studio Visual Studio 不同。它是免费的,重量轻,而且通常被认为是积极的。
    2. 安装ruby dev kit;您应该按照他们报告中的说明进行安装: https://github.com/oneclick/rubyinstaller/wiki/development kit
    3. 接下来,您可以通过Web浏览器安装扩展,也可以在IDE内部安装扩展;这是在IDE内部进行的。如果您选择了另一个,则可以在此处 导航到vscode的扩展部分;您可以用两种方法来实现这一点,但最适合未来使用的方法可能是点击 f1 ,然后键入out e x t 直到一个名为 extensions:install extensions 的选项可用。备选方案包括 ctrl shift x 和从顶部菜单栏, view->extensions
    4. 接下来,您将需要以下扩展;这些扩展不是100%必需的,但在您修补了一些扩展之后,我将让您决定保留什么:
      • Ruby;扩展作者彭吕
      • ruby rubocop;扩展作者Misogi
      • Ruby Linter;扩展作者Cody Hoover
    5. 在Ruby脚本的目录中,我们将通过名为 .vscode>的命令行创建一个目录,在那里我们将只创建一个名为 launch.json>的文件,其中我们将存储一些配置选项。
      • launch.json contents

    <代码> { “version”:“0.2.0”, “配置”: [ { “name”:“调试本地文件”, “类型”:“红宝石”, “request”:“启动”, “cwd”:“$工作区根”, “program”:“workspaceroot/../script_name.rb”, “ARGS”: “ShowDebuggeRoutput”:真 } ] } < /代码>

    <开始=“6”>
  • 按照扩展作者的说明手动安装gem。它现在位于这里: https://github.com/rubyide/vscode ruby install ruby dependencies
  • 您可能希望能够在任何需要的地方放置断点;如果不启用此选项,可能会导致混淆。要执行此操作,我们将转到顶部菜单栏,然后选择 file->preferences->settings (or ctrl- , )并滚动,直到到达 debug 部分。展开它并查找一个名为“debug.allowbreakpointseverywhere”的字段. ——选择该字段并单击“Little Pencil Looking”图标,然后将其设置为 true。
  • 完成所有有趣的工作后,您应该能够在类似于此的菜单中为2017年年中设置断点和调试,以及更暗的主题: = with all the fun stufactures like your call stack,variable vieWER等

    最大的pita是1)安装pre-req和2)记住配置 .vscode\launch.json 文件。只有2可以为将来的项目添加任何负担,您只需复制一个足够通用的配置,如上面列出的配置。可能有一个更一般的配置位置,但我不知道在我的头上。

    机翼 自由的 .

    快速指示

    1. 安装VSCODE
    2. 如果还没有安装Ruby开发工具包
    3. 为vscode安装ruby、ruby linter和ruby rubocop扩展
    4. 手动安装任何gems rubyide/vscode-ruby specifies 如果需要的话
    5. 配置你的 launch.json 使用 "cwd" "program" 字段使用 {workspaceRoot}
    6. 添加名为的字段 "showDebuggerOutput" 并将其设置为 true
    7. 在调试首选项中的任何位置启用断点 "debug.allowBreakpointsEverywhere": true

    详细说明

    1. 下载 Visual Studio Code 阿卡 vscode ;这与 Visual Studio . 它是免费的,重量轻,而且被普遍看好。
    2. 安装Ruby开发工具包;您应该按照他们报告中的说明操作: https://github.com/oneclick/rubyinstaller/wiki/Development-Kit
    3. 接下来,您可以通过Web浏览器安装扩展,也可以在IDE内部安装扩展;这是在IDE内部进行的。如果你选择另一个,你可以去 here . 导航到vscode的扩展部分;您可以用两种方法来实现这一点,但最适合未来使用的方法可能是 一层楼 ,然后输入 e X T 直到一个选项调用 扩展:安装扩展 变得可用。替代方案是 Ctrl键 换档 X 从顶部菜单栏, View->Extensions
    4. 接下来,您将需要以下扩展;这些扩展不是100%必需的,但在您修补了一些扩展之后,我将让您决定保留什么:
      • Ruby;扩展作者彭吕
      • ruby rubocop;扩展作者misogi
      • Ruby Linter;扩展作者Cody Hoover
    5. 在Ruby脚本的目录中,我们将通过命令行创建一个名为 .vscode 在那里我们只有一个文件叫做 杰森 我们将在其中存储一些配置选项。
      • 杰森 内容

    { "version": "0.2.0", "configurations": [ { "name": "Debug Local File", "type":"Ruby", "request": "launch", "cwd": "${workspaceRoot}", "program": "{workspaceRoot}/../script_name.rb", "args": [], "showDebuggerOutput": true } ] }

    1. 按照扩展作者的说明手动安装gem。它现在就在这里: https://github.com/rubyide/vscode-ruby#install-ruby-dependencies
    2. 您可能希望能够在任何需要的地方放置断点;如果不启用此选项,可能会导致混淆。为此,我们将转到顶部菜单栏并选择 File->Preferences->Settings (或) Ctrl键 , )滚动到 Debug 部分。展开它并查找一个名为 "debug.allowBreakpointsEverywhere" --选择该字段并单击看起来像铅笔的小图标,然后将其设置为 .

    在做了所有有趣的事情之后,您应该能够在类似于此的菜单中设置断点和调试,用于2017年年中和更黑暗的主题: enter image description here 所有有趣的东西,比如调用堆栈、变量查看器等。

    最大的pita是1)安装pre-req和2)记住配置 .vscode\launch.json 文件。只有2可以为将来的项目添加任何负担,您只需复制一个足够通用的配置,如上面列出的配置。可能有一个更一般的配置位置,但我不知道我的头。

        7
  •  6
  •   undur_gongor user3795579    9 年前

    所有其他的答案已经给出了几乎所有的…只是一点补充。

    如果您希望使用更多的IDE(如调试器(非CLI),并且不害怕使用VIM作为编辑器,我建议 Vim Ruby Debugger 插件。

    它的文档非常简单,所以请按照链接查看。简而言之,它允许您在编辑器中的当前行设置断点,暂停时在漂亮的窗口中查看局部变量,跨过/跨过几乎所有常见的调试器功能。

    对我来说,使用这个VIM调试器调试Rails应用程序是非常愉快的,尽管 rich logger abilities 几乎不需要铁路。

        8
  •  5
  •   ghostdog74    14 年前
    1. 你可以一路打印你的变量
    2. 打开 -w (警告)标志
    3. 使用诸如 ruby-debug
        9
  •  5
  •   DavidSilveira    11 年前

    我强烈推荐这个视频,以便在当前选择合适的工具来调试代码。

    https://www.youtube.com/watch?v=GwgF8GcynV0

    就我个人而言,我会在这段视频中突出两大主题。

    • 对调试数据来说,Pry非常棒,“Pry是一个数据浏览器”(sic)
    • 调试程序似乎更适合逐步调试。

    那是我的两分钱!

        10
  •  5
  •   nurettin João    10 年前

    我刚刚发现了这个gem(把proy变成了mri Ruby 2.0+的调试器)

    https://github.com/deivid-rodriguez/pry-byebug

    break SomeClass#run            # Break at the start of `SomeClass#run`.
    break Foo#bar if baz?          # Break at `Foo#bar` only if `baz?`.
    break app/models/user.rb:15    # Break at line 15 in user.rb.
    break 14                       # Break at line 14 in the current file.
    
        11
  •  5
  •   Community CDub    8 年前

    要轻松调试Ruby Shell脚本,只需将其第一行更改为:

    #!/usr/bin/env ruby
    

    到:

    #!/usr/bin/env ruby -rdebug
    

    每次显示调试器控制台时,您都可以选择:

    • c 对于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)
    

    然后检查您的进程前景。

    替换 低密度脂蛋白 具有 GDB 如果效果更好。前缀与 sudo 调试非拥有的进程。

        12
  •  5
  •   David Grayson    8 年前

    从Ruby2.4.0开始,在任何Ruby程序的中间启动IRBRepl会话都比较容易。将这些行放在要调试的程序中的点上:

    require 'irb'
    binding.irb
    

    您可以运行Ruby代码并打印出局部变量。类型CTRL+D或 quit 结束repl并让ruby程序继续运行。

    您也可以使用 puts p 打印程序运行时的值。

        13
  •  3
  •   Yuci    7 年前

    如果您使用的是rubymine,调试ruby脚本是简单而简单的。

    假设你有一个Ruby脚本hello_world.rb

    1。设置断点

    在第6行设置断点,如下所示。

    2。开始调试

    现在,您可以启动调试器来运行脚本:

    3。检查变量等

    然后,当执行遇到断点时,您将能够检查变量等。

    更多信息供您参考

    1. 如果您想 use rubymine to do remote debugging ,you can do so.
    2. 如果您想 use rubymine to remote debug rails running inside a docker. ,it is also directly.

    假设你有一个Ruby脚本hello_world.rb

    1。设置断点

    在第6行设置一个断点,如下所示。

    enter image description here

    2。开始调试

    现在,您可以启动调试器来运行脚本:

    enter image description here

    enter image description here

    三。检查变量等。

    然后,当执行到达一个断点时,您将能够检查变量等。

    enter image description here

    更多信息供您参考

    1. 如果你愿意的话 use RubyMine to do remote debugging 你可以这样做。
    2. 如果你愿意的话 use RubyMine to remote debug rails running inside a docker 也很简单。
        14
  •  2
  •   edx    12 年前

    printf调试

    调试技术一直存在争议, 有些人喜欢用print语句进行调试, 其他一些人喜欢用调试器深入挖掘。

    我建议你尝试两种方法。

    事实上,最近一个老Unix的人说, 在某些情况下,printf调试对他来说是一种更快的方法。

    但是如果你是新来的,需要理解一大堆代码, 那么,在那里走来走去真的很有用, 在这里和那里放置一些断点, 和它一起工作。

    它应该让您了解代码是如何编织的。

    如果你对其他人的软件不熟悉, 它可能会帮助你跨过那里。

    你很快就会知道他们是否安排得很巧妙, 或者只是一堆狗屎。

        15
  •  2
  •   Thong Kuah svlasov    9 年前

    好吧,Ruby Standard lib有一个易于使用的类似gdb的控制台调试器: http://ruby-doc.org/stdlib-2.1.0/libdoc/debug/rdoc/DEBUGGER__.html 不需要安装任何额外的宝石。Rails脚本也可以这样调试。

    例如

    def say(word)
      require 'debug'
      puts word
    end
    
        16
  •  1
  •   Aaron Qian    14 年前

    所有调试器的母亲都是普通的旧打印屏幕。大多数时候,你可能只想检查一些简单的物体,一个快速简单的方法是这样的:

    @result = fetch_result
    
    p "--------------------------"
    p @result
    

    这将把@result的内容打印到stdout,并在前面加一行以便于识别。

    另外,如果您使用像Rails这样的自动加载/重新加载功能框架,您甚至不需要重新启动应用程序。(除非由于特定于框架的设置而没有重新加载正在调试的代码)

    我发现这适用于90%的用例。您也可以使用RubyDebug,但我发现它在大多数情况下都是多余的。

        17
  •  1
  •   Daniel Garmoshka    7 年前

    有许多具有不同功能的调试程序,您可以根据它们进行选择。我的工作重点很满意 pry-moves 那是:

    • 关于如何使用的快速可理解信息
    • 直观的步骤(例如,轻松进入区块)
    • “后退”(撬动部分满足需要)
    推荐文章