PRagger crash とその後

実際に PRagger がクラッシュするわけではないですけれど、
プラグインを開発していたり、野良プラグインを入れてみたときに、
設定の間違いや何かで、exception が発生することがあります。


そのときに、data がどんなデータを持っていたかを知っていると
デバッグしやすいかな、と思い、PRaggerプラグイン実行中に
exceptin が発生が発生すると、そのプラグインに渡した data の
内容を YAML に出力するというパッチを作ってみました。


出力するファイル名はフォーマット固定にしています。
core_[モジュール名].[PID] です。


この機能は、YAML::load と YAML::save を突っ込めばできるんだけれども、
起きてからはでは遅いし、exception が発生する時ってのは、
たまたまデバッグコードを外したときだったりすることが多いからね。

*** pragger.rb.org	Sun Oct 14 01:29:39 2007
--- pragger.rb	Sun Mar 09 23:38:41 2008
***************
*** 24,31 ****
  
  def eval_pragger(command_array,data)
    command_array.inject(data) do |data, command|
!     puts "exec plugin #{command["module"]}"
!     $plugins[command["module"]].send(command["module"].sub(/.*::/,""), command["config"] || {}, data.dup)
    end
  end
  
--- 24,41 ----
  
  def eval_pragger(command_array,data)
    command_array.inject(data) do |data, command|
!     begin
!       puts "exec plugin #{command["module"]}"
!       $plugins[command["module"]].send(command["module"].sub(/.*::/,""), command["config"] || {}, data.dup)
!     rescue Exception => e
!       File.open('core_' + command["module"].sub(/.*::/,"_") + '.' + $$.to_s, "w") do |f|
!         YAML.dump(data, f)
!       end
!       bt = e.backtrace
!       puts "#{bt.shift}: #{e.message} (#{e.class})"
!       print bt.map{|s| "\tfrom #{s}"}.join("\n")
!       break
!     end
    end
  end

参考

例外のメッセージを自前でやる方法は以下を参考にしました。

例外表示を自分でやってみる - Greenbear Diary (2006-09-25)