高级Rails调试的策略建议?

时间:2011-09-08 11:01:13

标签: ruby-on-rails debugging

我已经在Ruby / Rails编写了近9个月的编程,在Python之前花了数年时间。

虽然我真的很喜欢Rails,但有一个地方我常常感到沮丧:追逐顽固的错误。在其他语言中,我几乎总能在没有太多麻烦的情况下追踪困难,但是当我在墙上调试轨道时,我倾向于真的撞墙。我想我要问的是:高级rails用户采用什么策略来追踪更顽固的错误?

目前我的做法通常是:

  1. 检查堆栈跟踪(此处解决的大多数简单错误)

  2. 运行debugger / pry / console&检查环境,必要时逐步完成每一步

  3. Google it

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

  5. 拖延和/或大肆宣誓

  6. 如果任何先进的铁路运营商分享他们追逐更顽固的错误的策略,我会非常感激。简而言之,当跟踪/调试器没有提供任何线索时你会怎么做?

3 个答案:

答案 0 :(得分:2)

我个人发现启动rails控制台并手动执行操作有助于理清大多数“难以追踪”的错误。但是,最近我开始使用pry并将“binding.pry”调用添加到我想要调试的代码中。似乎诀窍是找出 where 来放置binding.pry调用。在视图代码中非常宝贵,以及您继承的复杂测试代码。

答案 1 :(得分:1)

与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

答案 2 :(得分:0)

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

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