【问题标题】:Strategy advice for advanced Rails debugging?高级 Rails 调试的策略建议?
【发布时间】:2018-05-04 18:21:44
【问题描述】:

我已经用 Ruby/Rails 编码近 9 个月了,在此之前我在 Python 中度过了数年。

虽然我真的很喜欢 Rails,但我经常发现自己在一个方面感到沮丧:追踪顽固的错误。在其他语言中,我几乎总能轻松找到困难,但是当我碰壁调试轨道时,我倾向于真的碰壁。我想我要问的是:高级 Rails 用户采用什么策略来追踪更顽固的错误?

目前我的做法通常是:

  1. 检查堆栈跟踪(这里解决了最简单的错误)

  2. 运行调试器/pry/console 并检查环境,必要时逐步完成每个步骤

  3. 谷歌一下

  4. 发布堆栈溢出/github 问题

  5. 拖延和/或大量发誓

如果任何高级 Rails-ers 能分享他们追踪更顽固的错误的策略,我将非常感激。简而言之,当跟踪/调试器没有提供任何线索时,你会怎么做?

【问题讨论】:

    标签: ruby-on-rails debugging


    【解决方案1】:

    我个人发现,启动 rails 控制台并手动遍历那里的内容有助于解决大多数“难以追踪”的错误。然而,最近我开始使用 pry 并将“binding.pry”调用添加到我想要调试的代码中。看来诀窍是找出 where 放置 binding.pry 调用。在视图代码以及您继承的复杂测试代码中非常宝贵。

    【讨论】:

      【解决方案2】:

      使用 Rails 仅仅 5 年,我不认为自己是高级 Railser,但是我很乐意分享我的知识。 :-)

      处理任何(除了一些非常非常琐碎的问题)的主要事情是为此错误编写测试

      有几次我在这个阶段解决了这个错误——例如当这个错误与自动类重新加载有关时,它在开发中是活跃的,在测试模式下是关闭的。

      然后我通常只放置一些logger.debug 语句,其中包含很多inspectcaller(0).join("\n\t")。然后我非常仔细地检查了日志文件。

      因为“test.log”可能有几百兆字节,所以我总是记得在运行测试之前将其归零。此外,我通常只运行一种测试方法,否则输出将无法读取。

      我不使用专用调试器。在一些旧版本的 ruby​​ 中,调试器停止工作,我学会了没有它就活下去,再也没有回头。


      一些可能有用的实用程序:

      在我的~/.bashrc 中定义的一个函数,它允许我调用单个测试方法(或一组方法):

      $ testuj test/unit/user_test.rb -n test_name_validations
      $ testuj test/unit/user_test.rb -n /_name_/
      
      function testuj () {
        if [ -n "${BUNDLE_GEMFILE}" ]
        then
          # This is a Rails3 project - it is run by `bundle exec`
          ruby -I"lib:test" "$@"
        else
          # This is a Rails1 project. No bundler.
          ruby -e 'ARGV.each { |f| load f unless f =~ /^-/ ; break if f == "-n" }' "$@"
        fi
      }
      

      这种方法可以帮助我记录和检查某些步骤的时间:

      Object.module_eval do
        def czekpoint(note = nil)
          n = Time.now
          $czekpoint_previous ||= n
          $czekpoint_number ||= 0
          $czekpoint_number += 1
          t = n - $czekpoint_previous
          msg = "CZEKPOINT: %2d  %8.6f  %s %s" % [$czekpoint_number, t, caller.first.to_s.in_yellow, note.to_s.in_red]
          Rails.logger.debug msg # In older Rails it was RAILS_DEFAULT_LOGGER
          STDERR.puts msg
          $czekpoint_previous = n
        end
      end
      

      【讨论】:

        【解决方案3】:

        您可以使用多种 gem 进行调试,其中最受欢迎的是 prybyebug,它们都可以帮助您在开发过程中快速轻松地跟踪错误。

        对于生产,我建议设置rollbar 来报告生产服务器中所有未处理的错误和异常。这是一个简单的article about debugging in rails,可以帮助您。

        【讨论】:

          猜你喜欢
          • 2016-07-07
          • 2010-10-15
          • 2017-03-21
          • 2018-10-21
          • 2012-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多