2011-09-08 81 views
6

现在我已经在Ruby/Rails中编写了将近9个月的代码,在Python之前花了数年的时间。高级Rails调试的策略建议?

虽然我真的很喜欢Rails的,有一个领域,我经常发现自己沮丧:追顽固的错误。在其他语言中,我几乎可以一直追查困难,没有太多的麻烦,但是当我碰了壁调试轨道,我倾向于真正碰了壁。我想我问的是:高级轨道用户采用什么策略来追踪更顽固的错误?

目前我的做法通常是:

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

  2. 运行调试器/撬/控制台&检查环境,步伐完成每个步骤如果必要的话

  3. 谷歌它

  4. 后堆栈overf低/ github上发出

  5. 拖延和/或发誓大汗

如果任何先进的轨道-ERS将分享他们对追逐比较顽固的错误策略,我会非常感激。总之,当跟踪/调试器没有提供任何线索时,你会做什么?

回答

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" "[email protected]" 
    else 
    # This is a Rails1 project. No bundler. 
    ruby -e 'ARGV.each { |f| load f unless f =~ /^-/ ; break if f == "-n" }' "[email protected]" 
    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

我个人发现,启动导轨控制台并手动完成这些操作有助于理清大多数“难以追查”的错误。但是,最近我开始使用pry并将“binding.pry”调用添加到我想要调试的代码中。看来诀窍是弄清楚哪里有来放置binding.pry调用。在视图代码中非常有用,以及您继承的复杂测试代码。

+0

+1因为这有效。裴是你的朋友。 – Trip