2011-09-08 12 views
6

私はPythonで数年前にRuby/Railsを9ヶ月間コーディングしてきました。高度なRailsデバッグの戦略アドバイスはありますか?

私は本当にRailsを楽しんでいますが、挫折したバグを追いかけて自分を悩ませている場所があります。他の言語では、私はほとんどいつも困難を犯さずに追跡することができますが、レールをデバッグする壁に当たったとき、私はのように実際ににヒットします。私は何を求めているのでしょうか?高度なレールユーザーがより頑強なエラーを追跡するためにどのような戦略を採用していますか?

現時点では私のアプローチは、通常は次のとおりです。

  1. は、各工程を経ペース、

  2. 実行デバッガ/ PRY /コンソール&環境を調べて(ここでは解決最も簡単なバグ)スタックトレースを調べ必要に応じて

  3. Googleのそれ

  4. ポストスタック上overf低/ githubのは

  5. 先延ばしを発行し、および/または任意の高度なレール-ERSは、より多くの頑固なバグを追いかけための彼らの戦略を共有したい場合やたら

誓う、私は本当に感謝するだろう。要するに、トレース/デバッガで手がかりが得られないときはどうしますか?

答えて

1

レールでわずか5年であることから、私は自分自身を高度なレールサーとはみなしませんが、それでも私は自分の知識を喜んで共有します。 :-)

に(いくつかの非常に、非常に些細なものを除く)任意のとされて扱う主なものは、このバグのためのテストを書きます。

この段階でバグが解決されたのは数回ありました。たとえば、バグが開発中のアクティブなクラスの再読み込みに関連していて、テストモードでオフになっていたなどです。

次に、私は通常、inspectcaller(0).join("\n\t")という多数の文を入れます。次に、ログファイルを非常に慎重に調べます。

「test.log」には数百MBの容量がありますので、テストを実行する前に必ずゼロにしてください。また、私は通常、その時点で1つのテストメソッドしか実行しません。なぜなら、出力はそうでなければ読めなくなるからです。

専用のデバッガは使用しません。いくつかの旧バージョンの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です。 Pryはあなたの友人です。 – Trip

関連する問題