2011-09-08 76 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