set_trace_func を使うことで Ruby on Rails のデバッグが超はかどったという話。

最近、 rails で開発しているときに、set_trace_funcでエラー行を表示させるのが便利だったので、メモ。 gem で使っているライブラリも疑っていろいろ見ないといけないので、結構便利だ。

rails側では controllerか何かで適当に
require_relative "hogehoge" if Rails.env.development?
しておいて、hogehoge.rbには下に書いた感じで書くと、はかどった。

実際には、if文の条件をもっといろいろ追加して、余計な出力を出さないようにするが、大筋ではこんな感じ。
eventでc-callやらc-returnを指定すれば、cで書いたメソッドの呼び出しと戻りも表示できる、ということで、いろいろできそうだ。

require 'pp'
set_trace_func lambda{|event, file, line, id, binding, klass|
  if event == "raise"
    # raise 例外が発生したファイル名と行番号を表示。
    print "#{event} at #{klass}:#{id} #{file}:#{line}"

    # 例外が発生した場所でのローカル変数一覧を表示。
    # railsではインスタンス変数やselfを表示させようとすると
    # 表示結果が多すぎて煩雑になる。
    binding.eval(local_variables.map{|v|[v.to_s, eval(v)]})
      .each{|name, val| print "#{name} = #{val.pretty_inspect}" }
  end
}

コメントを残す