我已经在Ruby / Rails编写了近9个月的编程,在Python之前花了数年时间。
虽然我真的很喜欢Rails,但有一个地方我常常感到沮丧:追逐顽固的错误。在其他语言中,我几乎总能在没有太多麻烦的情况下追踪困难,但是当我在墙上调试轨道时,我倾向于真的撞墙。我想我要问的是:高级rails用户采用什么策略来追踪更顽固的错误?
目前我的做法通常是:
检查堆栈跟踪(此处解决的大多数简单错误)
运行debugger / pry / console&检查环境,必要时逐步完成每一步
Google it
发布堆栈溢出/ github问题
拖延和/或大肆宣誓
如果任何先进的铁路运营商分享他们追逐更顽固的错误的策略,我会非常感激。简而言之,当跟踪/调试器没有提供任何线索时你会怎么做?
答案 0 :(得分:2)
我个人发现启动rails控制台并手动执行操作有助于理清大多数“难以追踪”的错误。但是,最近我开始使用pry并将“binding.pry”调用添加到我想要调试的代码中。似乎诀窍是找出 where 来放置binding.pry调用。在视图代码中非常宝贵,以及您继承的复杂测试代码。
答案 1 :(得分:1)
与Rails仅仅5年,我不认为自己是一个先进的Railser,但不过我会愉快地分享我的知识。 : - )
处理任何(除了一些非常非常简单的)之外的主要事情是为此错误编写测试。
有几次我在这个阶段解决了错误 - 例如当错误与自动类重新加载有关时,它在开发中处于活动状态,并在测试模式下关闭。
然后我通常会在其中放置一些logger.debug
语句,其中包含大量inspect
和caller(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)
您可以使用多种宝石进行调试,其中最受欢迎的是pry
和byebug
,它们都可以帮助您在开发过程中快速轻松地追踪错误。
对于生产,我建议设置rollbar
以报告生产服务器中的所有未处理错误和例外情况。这是一个简单的article about debugging in rails,可以帮助你。